Как исключить список полных путей к каталогам в команде find в Solaris - PullRequest
4 голосов
/ 22 октября 2011

У меня есть очень специфическая потребность найти неизвестные файлы и каталоги в Solaris с помощью сценария, и я должен иметь возможность исключить полные пути к каталогам из поиска, поскольку они содержат потенциально тысячи неиспользуемых файлов (и это нормально, потому что они являются файлами размещены на других серверах). Я даже не хочу, чтобы поиск выполнял поиск в этих каталогах, поскольку он зависал на сервере (процессор долго работал на 99%), поэтому отправка результатов поиска в egrep для фильтрации этих каталогов - не вариант.

Я знаю, что могу сделать это, чтобы исключить один из нескольких каталогов по имени:

find / -mount -local \( -type d -a \( -name dir1 -o -name dir2 -o dir3 \) \) -prune -o \( -nouser -o -nogroup \) -print

Однако, это будет соответствовать dir1 и dir2 в любом месте структуры каталогов любых каталогов, что является , а не , что я вообще хочу.

Я хочу предотвратить поиск даже в следующих каталогах (например):

/opt/dir1
/opt/dir2
/var/dir3/dir4

И я все еще хочу, чтобы он находил неизвестные файлы и каталоги в следующих каталогах:

/opt/somedir/dir1
/var/dir2
/home/user1/dir1

Я пытался использовать регулярное выражение в аргументах -name, но так как find только сопоставляет «name» с базовым именем того, что он находит, я не могу указать путь. К сожалению, находка Solaris не поддерживает параметры поиска GNU, такие как -wholename или -path, так что я немного облажался.

Моя цель - создать скрипт со следующим синтаксисом:

script.sh "/path/to/dir1,/path/to/dir2,/path/to/dir3"

Как я могу это сделать, используя find и стандартные сценарии sh (/ bin / sh) в Solaris (5.8 и выше)?

1 Ответ

2 голосов
/ 22 октября 2011

Нельзя сопоставлять файлы по полному пути с Solaris find, но вы можете сопоставлять файлы по индоду. Так что используйте ls -i, чтобы сгенерировать список inode для удаления, затем вызовите find. Это предполагает, что не так много каталогов, которые вы хотите удалить, чтобы вы превысили ограничение длины командной строки.

inode_matches=$(ls -bdi /opt/dir1 /opt/dir2 /var/dir3/dir4 |
                sed -e 's/ *\([0-9][0-9]*\) .*/-inum \1 -o/')
find / -xdev \( $inode_matches -nouser -o -nogroup \) -prune -o -print

Альтернативным подходом может быть использование скрипта Perl или Python и создание собственного обхода каталога. Perl поставляется со скриптом find2perl, который поможет вам начать работу с модулем File::Find. В Python см. Функцию walk в модуле os.path.

...