Як знайти лише файли в заданому каталозі та ігнорувати підкаталоги за допомогою bash


129

Я переглянув інші подібні запитання, але не знайшов жодного, який би дозволив мені зрозуміти концепцію та зробити її застосовною до моєї ситуації на основі мого обмеженого часу. Я просто запускаю команду find, щоб знайти певні файли, але деякі файли в підкаталогах мають те саме ім’я, яке я хочу ігнорувати. Дякуємо за будь-яку допомогу. Нижче наведена команда, яку я використовую:

Файли / шаблон, які мене цікавлять: / dev / abc-scanner, / dev / abc-cash ....

Команда:

find /dev/ -name 'abc-*'

Що повертається:

/dev/abc-scanner
/dev/abc-cash
...
...
...
/dev/.udev/names/abc-scanner
/dev/.udev/names/abc-cash

Я хочу ігнорувати останні файли: /dev/.udev / ...


9
ігнорувати конкретні підкаталоги чи не спускатися в будь-які підкаталоги? Для останнього використовуйте варіант -maxdepth 1
frankc

@frankc Опублікуйте це як відповідь.
cnicutar

Відповіді:


202

Якщо ви просто хочете обмежити знахідку до першого рівня, ви можете зробити:

 find /dev -maxdepth 1 -name 'abc-*'

... або якщо ви особливо хочете виключити .udevкаталог, ви можете зробити:

 find /dev -name '.udev' -prune -o -name 'abc-*' -print

Якби я хотів перелічити, де всі вищевказані символьні посилання вказували на знайдені у наведеній вище схемі, я б просто використав трубу? Щось на кшталт find / dev -maxdepth 1 -name 'abc- *' | ls -l
suffa

1
Краще використовувати xargsнатомість щось на кшталт: find /dev -maxdepth 1 -name 'abc-*' | xargs ls -lале якщо є ймовірність, що у них буде пробіл у назвах, вам слід зробитиfind /dev -maxdepth 1 -name 'abc-*' -print0 | xargs -0 ls -l
Марк Лонгейр

Однак, як вказує відповідь Стівена Дарлінгтона , я не впевнений, чому б ви не просто так зробилиls -l /dev/abc-*
Марк Лонгейр

Крім того, якщо ви хочете дізнатися, куди вказують посилання, ви можете зробитиfor x in /dev/abc-*; do readlink -f $x; done
Марк Лонгейр

1
Або якщо ви хочете, щоб підкаталоги тільки на першому рівні, ls -l /dev/abc-* /dev/*/abc-* | fgrep -v /dev/.udev... за винятком принаймні мого Linux /dev/*/*не включає файли, /dev/.udev/*щоб ви могли опустити fgrep -v.
tripleee

9

Чи є якась конкретна причина, яку потрібно використовувати find? Ви можете просто lsзнайти файли, які відповідають шаблону в каталозі.

ls /dev/abc-*

Якщо вам потрібно скористатися find, ви можете використовувати -maxdepth 1перемикач, щоб застосувати лише до вказаної директорії.


Я думаю, ви маєте на увазі, -maxdepth 1а не-maxdepth 0
Марк Лонгейр

5
Слід зазначити, що тут є важлива частина шаблону, а не ls. Ви можете знайти ті самі файли з echoабо wcу вас, оскільки оболонка розширює підстановку для вас. Тож for file in /dev/abc-*; do something with each "$file"; doneможе бути те, що ОП насправді шукає.
tripleee

1
Ах, я ніколи не можу згадати, в який бік це ... Дякую за редагування. Також варто зазначити, що це не універсально. Наприклад, версія Solaris findне має її.
Стівен Дарлінгтон

@tripleee +1. Так. Робити це все в оболонці було б краще, якщо можливо.
Стівен Дарлінгтон

1
@MustafaOzturk Це lsзайве. for f in abc*; ...це все, що вам потрібно.
Стівен Дарлінгтон

4

Це може робити те, що ви хочете:

find /dev \( ! -name /dev -prune \) -type f -print

2
Так, це працює. -maxdepth не реалізований у пошуку на деяких старих Unixes.
CCTO

-1
find /dev -maxdepth 1 -name 'abc-*'

Не працює для мене. Це нічого не повертає. Якщо я просто роблю '.' він дає мені всі файли в каталозі нижче того, над яким я працюю.

find /dev -maxdepth 1 -name "*.root" -type 'f' -size +100k -ls

Нічого не повертайте за допомогою "." натомість я отримую список усіх "великих" файлів у моєму каталозі, а також rootfiles / каталог, де я зберігаю старі.

Продовження. Це працює.

find ./ -maxdepth 1 -name "*.root" -type 'f' -size +100k -ls
564751   71 -rw-r--r--   1 snyder   bfactory   115739 May 21 12:39 ./R24eTightPiPi771052-55.root
565197  105 -rw-r--r--   1 snyder   bfactory   150719 May 21 14:27 ./R24eTightPiPi771106-2.root
565023   94 -rw-r--r--   1 snyder   bfactory   134180 May 21 12:59 ./R24eTightPiPi77999-109.root
719678   82 -rw-r--r--   1 snyder   bfactory   121149 May 21 12:42 ./R24eTightPiPi771098-10.root
564029  140 -rw-r--r--   1 snyder   bfactory   170181 May 21 14:14 ./combo77v.root

Мабуть, /dev означає каталог, що цікавить. Але ./це потрібно, не просто .. Потреба в цьому /не була очевидною навіть після того, як я зрозумів, що /devозначає більше чи менше.

Я не міг відповісти як коментар, оскільки не маю «репутації».


1
Ви отримуєте репутацію, даючи хороші відповіді. Будь ласка , прочитайте цю stackoverflow.com/conduct
aifrim

Є причини, які вам не дозволяють коментувати, і це не дає вам дозволу на коментарі тут, у розділі "Відповіді". Видаліть це.
Роб
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.