1

У меня, наверное, один глупый вопрос:

Я работаю на удаленном сервере под Solaris, используя ssh и моя задача состоит в том, чтобы найти определенные файлы в каталогах, соответствующих шаблону оболочки, но не идти рекурсивно глубже.

Предположим, у меня есть следующая иерархия каталогов:

dir-a/
    file-a
    file-b
    dir-c/
        file-a
dir-b/
    file-a
    file-b

и я хочу найти все файлы с именем file-a в каталогах dir-a & dir-b но не в каталоге dir-c . Хорошо, пока все хорошо - это действительно просто с помощью одной команды find :

 find dir-{a,b} -mindepth 1 -maxdepth 1 -name 'file-a'

но проблема в том, что на этой машине установлена действительно старая версия find поэтому она не имеет опций -mindepth и -maxdepth . Я пытался использовать -prune:

find dir-{a,b} \( -type d -prune \) -o -name file-a -print 

но он вообще ничего не печатает, потому что самые первые каталоги в дереве поиска - это сами каталоги dir-a и dir-b поэтому find просто пропустите их содержимое, как это и должно быть. Если бы я мог использовать -mindepth я бы просто пропустил эти "корневые" каталоги с -mindepth 1 и получил бы другое рабочее решение, но, как я уже сказал, не могу. depth не помогла также, потому что dir-a и dir-b являются последними в дереве поиска find, если оно использовалось, и dir-a/dir-c/file-a теперь снова выводится. Да, и в этой старой find также нет опций -regex и -wholepath поэтому я не могу использовать сложные шаблоны имен для исключения более глубоких файлов из результатов форм. Есть ли у вас какие-либо предположения?

3 ответа3

1

Вы можете сделать это, не используя find

ls dir-[ab]/file-a

Я заметил, что у SunFreeware есть пакеты GNU findutils для Solaris.

0

Кажется, это делает то, что вы хотите:

find dir-a dir-b -type d ! -name dir-a ! -name dir-b -prune -o -name file-a -print

Вот разбивка:

-type d ! -name dir-a ! -name dir-b -prune

Любые каталоги, которые не называются dir-a или dir-b , удаляются.

-name file-a -print

Затем напечатайте любой другой объект с именем «file-a», но тогда это должно быть очевидно.

Я предполагаю, что версия Solaris, которую вы используете, не имеет оператора -not , поэтому используйте более старую версию ! оператор вместо.

Недостатком является то, что вам нужно будет добавить ! -name предложений для каждого каталога, введенного в командной строке. Но вы можете сгенерировать команду для более общей настройки.

0

Вы можете использовать grep(1), чтобы преодолеть отсутствие -mindepth и -maxdepth в реализации find(1), используемой Solaris.

Не очень симпатичное, но простое и быстрое решение, если вы ограничены в выборе установленного программного обеспечения (то есть сидите перед машиной клиента):

$ find . -name test
./test
./test/test
./test/test/test
./test/test/test2/test

$ find . -name test | grep -v '/.*/.*/' | grep '/.*/' 
./test/test

Вы можете сэкономить на стоимости одного процесса, используя awk(1):

$ find . -name test | awk -F/ 'NF == 3'
./test/test

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .