GNU find: сначала поиск в текущем каталоге - PullRequest
3 голосов
/ 18 ноября 2010

как мне сказать find найти сначала в текущей папке, а затем продолжить поиск в подпапках? У меня есть следующее:

$ find . -iname '.note'
folder/1/.note
folder/2/.note
folder/3/.note
folder/.note

Что я хочу это:

$ find . -iname '.note'
folder/.note
folder/1/.note
folder/2/.note
folder/3/.note

Есть идеи?

Ответы [ 5 ]

3 голосов
/ 19 ноября 2010

find алгоритм выглядит следующим образом:

  • Для каждого пути, указанного в командной строке, пусть текущая запись будет этим путем, затем:
    1. Сопоставить текущую запись с выражением.
    2. Если текущая запись является каталогом, выполните шаги 1 и 2 для каждой записи в этом каталоге в неопределенном порядке.

При первичном -depth шаги 1 и 2 выполняются в обратном порядке.

Что вы просите find сделать, так это рассмотреть файлы перед каталогами на шаге 2. Но find не имеет возможности сделать это.

В вашем примере все имена соответствующих файлов располагаются перед именами подкаталогов в одном каталоге, поэтому find . -iname '.note' | sort будет работать. Но это явно не обобщает.

Один из способов обработки не-каталогов перед каталогами - запустить команду find для итерации по каталогам и отдельную команду (возможно, снова find) для печати соответствующих файлов в этом каталоге.

find -type d -exec print-matching-files-in {} \;

Если вы хотите использовать выражение find для сопоставления файлов, вот общая структура второй команды find для итерации только по не-каталогам в указанном каталоге, не рекурсивно (требуется GNU-поиск):

find -type d -exec find {} -maxdepth 1 \! -type d … \;

Например:

find -type d -exec find {} -maxdepth 1 \! -type d -iname '.note' \;

В зш можно написать

print -l **/(#i).note(Od)

**/ рекурсивно в подкаталоги; (#i) (флаг globbing ) интерпретирует то, что следует, как шаблон без учета регистра, а (Od) ( glob qualifier ) упорядочивает результат рекурсивных обходов, чтобы файлы в Каталог считаются перед подкаталогами. При (Odon) выходные данные сортируются лексикографически в пределах ограничения, установленного Od (то есть первичный критерий сортировки идет первым).

1 голос
/ 18 ноября 2010

Обходной путь будет find . -iname '.note' | sort -r:

$ find . -iname '.note' | sort -r
folder/.note
folder/3/.note
folder/2/.note
folder/1/.note

Но здесь выходные данные просто сортируются в обратном порядке, и это не меняет поведение поиска.

1 голос
/ 18 ноября 2010

Для меня с GNU find в Linux я получаю оба заказа с разными тестовыми прогонами.

Тестовый случай:

rm -rf /tmp/depthtest ; mkdir -p /tmp/depthtest ; cd /tmp/depthtest ; for dir in 1 2 3 . ; do mkdir -p $dir ; touch $dir/.note ; done ; find . -iname '.note'

С помощью этого теста я получаю первый результат автора.Обратите внимание на порядок 1 2 3 ..Если я изменю этот порядок на . 1 2 3

rm -rf /tmp/depthtest ; mkdir -p /tmp/depthtest ; cd /tmp/depthtest ; for dir in . 1 2 3 ; do mkdir -p $dir ; touch $dir/.note ; done ; find . -iname '.note'

, я получу второй результат автора.

В любом случае добавление -depth для поиска ничего не дает.

РЕДАКТИРОВАТЬ:

Я написал Perl Oneliner, чтобы посмотреть на это дальше:

perl -e 'opendir(DH,".") ; print join("\n", readdir(DH)),"\n" ; closedir(DH)'

И я запустил это с / tmp / deeptest после запуска тестового примера 1 с этимирезультаты:

.
..
1
2
3
.note

Я запустил его снова после теста 2 со следующими результатами:

.
..
.note
1
2
3

, который подтверждает, что результаты находятся в порядке каталога.

* 1028Параметр * позволяет найти только элементы управления, например, обрабатывается ли ./1/.note до или после ./1/, а не является ли ./.note или. /1/ первым, поэтому порядок результатов основан исключительно на порядке каталогов (который в основном создаетсяпорядок).

Может быть полезно взглянуть на Как мне рекурсивно перечислить все каталоги в определенном месте, в ширину? , чтобы узнать, как обойти эту проблему.

0 голосов
/ 08 февраля 2015

Найти в текущей папке

 find ./in_save/ -type f -maxdepth 1| more

==> 73!

0 голосов
/ 18 ноября 2010

find -s . -iname ".note" не помогает?или find . -iname '.note'|sort?

...