Що таке Linux еквівалент DOS "dir / s / b filename"?


17

Перерахуйте всі файли / dirs у поточному каталозі або нижче, який відповідає "ім'я файлу".

Відповіді:


28

Прямий еквівалент є

find . -iname <filename>

в якому будуть перераховані всі названі файли та каталоги <filename> у поточному каталозі, та будь-які підкаталоги, ігноруючи регістр.

Якщо ваша версія пошуку не підтримує -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'.
Жил "ТАК - перестань бути злим"

@Gilles, оновив свою відповідь, щоб сказати це, дякую.
Мікель

2
Використання <filename>в якості маркера для введення користувача - це погана звичка в середовищі командного рядка, де < and >більшість часу мають конкретне значення. Я пропоную просто використовувати filename, можливо, FILENAME, щоб підкреслити це. Більшість людей зрозуміють, а ті, хто цього не зробить, можуть заподіяти шкоду, не розуміючи, що вони не повинні бити на знак менший чи більший, ніж на знак.
користувач невідомий

2
<filename>є умовою у багатьох документах UNIX, тому я думаю, що людям корисно усвідомлювати це, але я згоден, що це FILENAMEможе бути легше зрозуміти.
Мікель

1
find -iname <filename>краще, оскільки він нечутливий до регістру, як DOS
Агнел Куріан

8

Деякі снаряди дозволяють ls **/filename, що досить зручно.


1
Гарна думка. В останніх версіях bash біг shopt -s globstar; echo **/filenameеквівалентний find . -name "filename". Він також працює в zsh.
Мікель

Це "ls ** / ім'я файлу" добре, але, схоже, не заглиблюється на рівні одного каталогу.
Sopalajo de Arrierez

@ sopalajo-de-arrierez Якщо ви це зробите shopt -s globstar, це, ймовірно, допоможе вам. Рекурсивний глобулінг - це функція, яка доступна лише в деяких оболонках, а іноді вона за замовчуванням не вмикається.
Шон Дж. Гофф

Ой ... Я зараз розумію, @ ShawnJ.Goff: shoptкоманда включає опцію globstar on. Зараз це працює як шарм. Дуже дякую.
Sopalajo de Arrierez

4

Ви можете це зробити за допомогою

find . | egrep filename

1
Ви також можете зробити це в одному з find . -regextype posix-egrep -regex '.*filename.*'(я не знаю, чи egrepважлива частина, але ви використали egrepу своїй відповіді, тому я включив її)
Michael Mrozek

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

1
Подумайте про це, кульки-шкаралупи також відрізняються від макетів DOS. Наприклад, find . -name "*.*"не буде робити те, що ви очікували від фону DOS. Глобуси досить близькі, щоб їх можна було впізнати, хоча регулярні виразки є абсолютно новим звіром.
Джендер

Що *.*.*робити в сучасних дос, тобто windows cmd? Про що *.*.*.*?
ctrl-alt-delor

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