Мне нужна помощь, чтобы получить find
команда работает прямо в работающем скрипте. Мне нужно исключить некоторые каталоги. Ниже у меня есть работа над тем, что я делаю.
sudo find / ( -name firefox -o -name thunderbird -o -name seamonkey \) -type f 2>/dev/null|grep -v '(10_Recommended|repo)'
Я хотел бы исключить некоторые каталоги, чтобы сценарий или find
команда не занимает так много времени.
В приведенном выше примере я хочу исключить /export/repo
, который является монтированием NFS и /10_Recommended*
это начало набора исправлений, используемого на сервере Solaris. Текущий пример: /10_Recommended_CPU_2014-01
.
Я пробовал использовать -prune
и !
заявления, и это просто не работает. Может ли кто-нибудь помочь мне с этим?
Я настраиваю эту команду на Solaris 10, RHEL 5, SLES 11 SP2.
Попробуй добавить:
-not -path "/10_Recommended*" -not -path "/export/repo/*"
Но будьте осторожны, путь к этим репозиториям зависит от того, где и как вы выполняете команду find.
Если вы в /
и ты делаешь find -name
что бы то ни было, вы должны добавить .
на нежелательном пути.
Для вас это будет:
find -name whatever -not -path "./10_Recommended*" -not -path "./export/repo/*"
Но если вы добавили /
как и вы после команды find, вы должны удалить эти точки:
find / -name whatever -not -path "/10_Recommended*" -not -path "/export/repo/*"
Спасибо всем за помощь. Ниже я опубликовал ответ на свой вопрос или, по крайней мере, то, что у меня сработало. Я тестирую приведенную ниже команду find на серверах Solaris 10, RHEL 5 и SLES 11.2.
Итак, ниже я показал последние команды поиска.
В поисках Java
# find / \( -name 10_Recommended* -o -name share \) -prune -o -type f -name java -print 2>/dev/null
Поиск приложений Mozilla
# find / \( -name 10_Recommended* -o -name share \) -prune -o -type f \( -name firefox -0 -name thunderbird -0 -name seamonkey \) -print 2>/dev/null
Надеюсь, кому-то это пригодится.
Попробуй это:
find / \( -path /export -o -path "/*Recommended*" \) -prune -o \
\( -name iceweasel -o -name thunderbird -type f \) -print 2>/dev/null
Причина здесь в том, что -prune
это своего рода постфиксное "действие", лучше всего сочетающееся с -path
. Сначала укажите пути, которые вы хотите игнорировать, а затем файлы, которые вы ищете. Это кажется неестественным по сравнению с префиксным характером других операций поиска.
Таким образом, сначала считается, что пути сокращаются, а если нет, то выполняется «другая сторона» переключателя -o. Наоборот, сначала он будет искать в глубине, и до обрезки никогда не добраться, по крайней мере, в моем понимании.
Переносимость будет проблемой несмотря ни на что, особенно между версиями Solaris и * nix. Может, тебе повезет с версией find
в OpenCSW, но никаких гарантий там нет. Создайте небольшой сценарий оболочки и проверьте тип ОС из uname
, освященная веками традиция сисадминов.
Вот пример с моей машины с использованием GNU find:
[fuzzed@ops ~]$ find / -path /usr -prune -o \( -name rsync -o -name bash \) -print 2>/dev/null
[fuzzed@ops ~]$ find / -path /usr/share -prune -o \( -name rsync -o -name bash \) -print 2>/dev/null
/usr/bin/bash
/usr/bin/rsync
Мой find
версия:
[fuzzed@ops ~]$ find --version
find (GNU findutils) 4.5.11
Кроме того, некоторые предикаты поддерживают подстановку или регулярное выражение, так что проверьте и это.