Назад | Перейти на главную страницу

Исключить с помощью команды поиска

Мне нужна помощь, чтобы получить 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

Кроме того, некоторые предикаты поддерживают подстановку или регулярное выражение, так что проверьте и это.