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

17

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

mackenir
источник

Ответы:

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для более подробной информации.

Mikel
источник
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
0

Это может быть также: tree -if </your/path>или 'pwd'как путь

Михаил Фатахов
источник