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


246

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

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

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

Ответы:


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

Для примера ОП я думаю, что это должно быть -maxdepth 1?
Пол Р

@ Пол Р.: На самом деле, это зависит от того, как он хочет обрабатывать скрытые файлы, но я все же исправил свой ответ. Для его примера 1, вероятно, то, что он хочет.
2010 года

1
Для меня -maxdepth 0не показывает никаких файлов, но -maxdepth 1работает как задумано, с скрытыми файлами, которые также отображаются.
Брюс Уэйн

1
@BruceWayne отметить *ин find DirsRoot/* -maxdepth 0 -type f. Если вы пропустите это, он не будет показывать никаких файлов.
mapeters

@ mook, спасибо, но я не могу вспомнить исходный контекст, в котором у меня была эта проблема, хаха.
Брюс Уэйн


17

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

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

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


спасибо за это решение, но нельзя ли это упростить до 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
Спиотер
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.