найти без рекурсии

246

Можно ли findкаким-то образом использовать команду, чтобы она не повторялась в подкаталогах? Например,

DirsRoot
  |-->SubDir1
  |    |-OtherFile1
  |-->SubDir2
  |    |-OtherFile2
  |-File1
  |-File2

И результат чего-то вроде find DirsRoot --donotrecuourse -type fбудет только File1, File2?

Filippo
источник

Ответы:

381

Я думаю, что вы получите то, что вы хотите с -maxdepth 1опцией, основываясь на вашей текущей структуре команд. Если нет, вы можете попробовать просмотреть страницу справочника find.

Соответствующая запись (для удобства):

-maxdepth levels
          Descend at most levels (a non-negative integer) levels of direc-
          tories below the command line arguments.   `-maxdepth  0'  means
          only  apply the tests and actions to the command line arguments.

Ваши варианты в основном:

find DirsRoot/* -maxdepth 0 -type f #This does not show hidden files

Или:

find DirsRoot/ -maxdepth 1 -type f #This does show hidden files
eldarerathis
источник
Для примера ОП я думаю, что это должно быть -maxdepth 1?
Пол Р
@ Пол Р.: На самом деле, это зависит от того, как он хочет обрабатывать скрытые файлы, но я все же исправил свой ответ. Для его примера 1, вероятно, то, что он хочет.
2010 года
1
Для меня -maxdepth 0не показывает никаких файлов, но -maxdepth 1работает как задумано, с скрытыми файлами, которые также отображаются.
Брюс Уэйн
1
@BruceWayne отметить *ин find DirsRoot/* -maxdepth 0 -type f. Если вы пропустите это, он не будет показывать никаких файлов.
mapeters
@ mook, спасибо, но я не могу вспомнить исходный контекст, в котором у меня была эта проблема, хаха.
Брюс Уэйн
33

Я верю, что вы ищете -maxdepth 1.

вафельный парадокс
источник
1
Для примера ОП я думаю, что это должно быть -maxdepth 1?
Пол Р
Да, если бы он использовал команду точно так же, как в своем примере, то это было бы 1. Моя ошибка.
вафельный парадокс
17

Если вы ищете POSIX-совместимое решение:

cd DirsRoot && find . -type f -print -o -name . -o -prune

-maxdepth не является POSIX-совместимым параметром.

sqr163
источник
спасибо за это решение, но нельзя ли это упростить до find DirsRoot/* -type f -prune?
Докаспар
@dokaspar Действительно отличный вопрос! (вы забыли вставить «-o» перед -prunebtw) Ответ - нет, он не может. Чтобы полностью понять, ПОЧЕМУ это нельзя упростить, просто отправьте set -xкоманду перед отправкой, find DirsRoot/* -type f -o -pruneи вы сразу увидите это сами. Коренная причина - ограничения расширения DirsRoot/*выражения оболочки .
sqr163
не работает на centos, все еще делает полную рекурсию на выходе !!!! Правильная командаfind . -name . -o -prune
Рейшин
в любом случае на Solaris, сохраняя DirsRoot в качестве желаемого пути, вам не нужен cd; вместо этого вы можете: найти DirsRoot /. -type f -print -o -name. -o -prune
Спиотер