Как найти файлы только в заданном каталоге и игнорировать подкаталоги с помощью bash


130

Я посмотрел на другие похожие вопросы, но не нашел ни одного, который позволил бы мне понять концепцию и применить ее к моей ситуации, исходя из моего ограниченного времени. Я просто запускаю команду 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

Ответы:


203

Если вы просто хотите ограничить поиск первым уровнем, вы можете:

 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может быть то, что на самом деле ищет OP.
Tripleee

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

@tripleee +1. Ага. Если возможно, было бы предпочтительнее делать все это в оболочке.
Стивен Дарлингтон

1
@MustafaOzturk Лишнее ls. for f in abc*; ...это все, что тебе нужно.
Стивен Дарлингтон,

4

Это может делать то, что вы хотите:

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

2
Да, это работает. -maxdepth не реализован в find в некоторых старых версиях Unix.
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.