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


246

Чи можливо використовувати findкоманду якимось чином, щоб вона не повторювалась у підкаталогах? Наприклад,

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

І результат чогось подібного find DirsRoot --donotrecuourse -type fбуде лише File1, File2?

Відповіді:


380

Я думаю, ти отримаєш те, що хочеш -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?
Пол Р

@Paul R: Насправді такий вид залежить від того, як він хоче обробляти приховані файли, але я все-таки змінив свою відповідь. Бо його приклад 1- це, мабуть, те, що він хоче.
eldarerathis

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

не працює на центоси, все ще робить повну рекурсію на виході !!!! Правильна командаfind . -name . -o -prune
Рейшин

на Solaris все одно, зберігаючи DirsRoot як потрібний шлях, вам не потрібен CD; натомість ви можете: знайти DirsRoot /. -тип f -print -o -ім'я. -o -prune
spioter
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.