Что такое Linux-эквивалент DOS «dir / s / b filename»?


17

Перечислите все файлы / каталоги в или ниже текущего каталога, которые соответствуют «имя файла».

Ответы:


28

Прямой эквивалент

find . -iname <filename>

в котором будут перечислены все файлы и каталоги, вызываемые <filename>в текущем каталоге, и любые подкаталоги, без учета регистра.

Если ваша версия find не поддерживает -iname, вы можете использовать -nameвместо этого. Обратите внимание, что в отличие от -iname, -nameчувствителен к регистру.

Если вы хотите перечислить только файлы с именами <filename>, а не каталоги, добавьте-type f

find . -iname <filename> -type f

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

find . -iname "*.txt" -type f

в противном случае оболочка расширит его.

Как уже отмечали другие, вы также можете сделать:

find . | grep "\.txt$"

grep будет печатать строки на основе регулярных выражений, которые являются более мощными, чем подстановочные знаки, но имеют другой синтаксис.

Смотрите man findи man grepдля более подробной информации.


3
Если <filename>содержит символы подстановки, используйте кавычки, например find . -name '*.txt'.
Жиль "ТАК ... перестать быть злым"

@ Жиль, обновил мой ответ, чтобы сказать это, спасибо.
Микель

2
Использование в <filename>качестве маркера для userinput - плохая привычка в среде командной строки, где < and >большую часть времени имеет конкретное значение. Я предлагаю просто использовать filename, может быть, FILENAME, чтобы подчеркнуть это. Большинство людей поймут, и те, кто этого не сделает, могут причинить вред, если не поймут, что они не должны попадать в знак «меньше или больше».
пользователь неизвестен

2
<filename>Это соглашение во многих документах UNIX, поэтому я думаю, что людям полезно знать об этом, но я согласен, что FILENAMEможет быть легче понять.
Микель

1
find -iname <filename>лучше, так как он нечувствителен к регистру, как DOS
Agnel Kurian

8

Позволяют некоторые снаряды ls **/filename, что довольно удобно.


1
Хорошая точка зрения. В последних версиях bash запуск shopt -s globstar; echo **/filenameэквивалентен find . -name "filename". Это также работает в Zsh.
Микель

Это 'ls ** / filename` хорошо, но, похоже, не более одного уровня каталога.
Сопалахо де Арриерес

@ sopalajo-de-arrierez Если вы это сделаете shopt -s globstar, это, вероятно, будет работать для вас. Рекурсивное сглаживание - это функция, которая доступна только в некоторых оболочках, а иногда она не включена по умолчанию.
Шон Дж. Гофф,

Опс ... Теперь я понимаю, @ ShawnJ.Goff: shoptкоманда включает эту опцию globstar on. Теперь это работает как шарм. Большое спасибо.
Сопалахо де Арриерес

4

Вы можете сделать это с

find . | egrep filename

1
Вы также можете сделать это в одном find . -regextype posix-egrep -regex '.*filename.*'(я не знаю, egrepважна ли эта часть, но вы использовали egrepв своем ответе, поэтому я включил ее)
Майкл Мрозек

Можно, но grep отличается от эквивалентной команды DOS. grepиспользует регулярные выражения, в то время как команда DOS использует подстановочные знаки оболочки.
Микель

1
Если подумать, оболочки-оболочки также отличаются от подстановочных знаков DOS. Например, find . -name "*.*"не будет делать то, что вы ожидаете от фона DOS. Однако глобусы достаточно близки, чтобы их можно было узнать, а регулярные выражения - совершенно новое чудовище.
Jander

Что делает *.*.*в современном DOS, то есть Windows CMD? Как насчет *.*.*.*?
Ctrl-Alt-Delor

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.