Ответы:
locate filename
find -name '*filename*'
echo **/*filename*
ls -ld **/*filename*
(Ознакомьтесь с основными положениями и условиями. Прочтите руководство для мелкого шрифта.)
Перечисление содержимого каталога является своего рода вторичной функцией ls
. Основная задача ls
, которая занимает большую часть своей сложности, - это точная настройка дисплея. (Посмотрите руководство и сравните количество опций, связанных с выбором файлов для отображения, с количеством опций, которые определяют, какую информацию отображать о каждом файле и как форматируется отображение. Это верно как для GNU, так и для вас ». Я найду в Linux и других системах с меньшим количеством опций, начиная с первых дней.)
Режим по умолчанию ls
- когда вы передаете ему каталог, он перечисляет файлы в этом каталоге. Если вы передадите ему файл любого другого типа (обычный файл, символическую ссылку и т. Д.), В нем будет указан только этот файл. (Это относится к каждому аргументу отдельно.) Опция -d
запрещает ls
спускаться в каталог.
ls
действительно есть опция, -R
которая говорит ему о рекурсивном списке каталогов. Но он имеет ограниченную применимость и не позволяет много фильтровать на выходе.
Самый первый инструмент для сопоставления с образцом - это сама оболочка. Вам не нужны никакие другие команды: просто введите свои символы, и все готово. Это известно как глобус .
echo *filename*
Традиционно подстановочные знаки ограничивались текущим каталогом (или указанным каталогом:) echo /some/where/*filename*
. A *
соответствует любому имени файла или любой части имени файла, но *.txt
не будет совпадать foo/bar.txt
. Современные оболочки добавили шаблон, **/
который означает «в этом каталоге или в любом каталоге под ним (рекурсивно)». В bash, по историческим причинам совместимости, эта функция должна быть явно включена с помощью shopt -s globstar
(вы можете поместить эту строку в свой ~/.bashrc
).
echo **/*filename*
Команда echo
просто выводит список имен файлов, сгенерированных оболочкой, обратно на вас. Как исключение, если нет подходящего имени файла вообще, шаблон подстановочного знака остается неизменным в bash (если только вы не установите shopt -s nullglob
, в этом случае шаблон расширяется до пустого списка), и zsh выдает ошибку (если вы не установили setopt nullglob
, или setopt no_no_match
что приводит к тому, что шаблон остается неизменным).
Вы можете все еще хотеть использовать ls
для его вариантов. Например, ls
может давать указания о характере или правах доступа к файлу (каталог, исполняемый файл и т. Д.) С помощью цветов. Вы можете отобразить дату, размер и владельца файла с помощью ls -l
. Смотрите руководство для многих других вариантов.
Традиционная команда ищет файл в дереве каталогов является find
. Он имеет много опций для контроля, какие файлы отображать и что с ними делать. Например, чтобы найти файлы, чье имя соответствует шаблону *filename*
в текущем каталоге и его подкаталогах, и напечатать их имена:
find /some/dir -name '*filename*' -print
-print
является действием (большинство других действий состоит из выполнения команды над файлом); если не ставить в действие, -print
подразумевается. Кроме того, если вы не указываете каталог для прохождения ( /some/dir
выше), подразумевается текущий каталог. Условие -name '*filename'
предписывает перечислять (или действовать) только файлы, чье имя соответствует этому шаблону; Есть много других фильтров, таких как -mtime -1
файлы, измененные за последние 24 часа. Иногда вы можете опустить кавычки -name '*filename*'
, но только если подстановочный знак не будет соответствовать ни одному файлу в текущем каталоге (см. Выше). В общем, краткая форма
find -name '*filename*'
Еще один полезный инструмент, когда вы знаете (часть) имя файла locate
. Этот инструмент запрашивает базу данных имен файлов. В типичных системах он обновляется каждую ночь. Преимущество locate
перед тем find /
, что это намного быстрее. Недостатком является то, что его информация может быть устаревшей. Существует несколько реализаций, locate
которые различаются по своему поведению в многопользовательских системах: базовая locate
программа индексирует только общедоступные файлы (вы можете захотеть запустить компаньон updatedb
для создания второй базы данных, которая индексирует все файлы в вашей учетной записи); Существуют другие версии (mlocate, slocate), которые индексируют все файлы и имеют locate
программу, фильтрующую базу данных, чтобы вернуть только те файлы, которые вы видите.
locate filename
Иногда вы думаете, что файл предоставляется пакетом в вашем дистрибутиве, вы знаете (часть) имя файла, но не имя вашего пакета, и вы хотите установить пакет. Многие дистрибутивы предоставляют инструмент для этого. На Ubuntu это так apt-file search filename
. Для эквивалентных команд в других системах, проверьте Pacman Rosetta .
эквивалент вашего примера DOS будет:
cd /
find . -name \*filename\* -print
Однако в Linux вам больше не нужен -print
аргумент. Если вы работаете с другими операционными системами, об этом может быть полезно знать.
Если вы хотите что-то «быстрое» , но не в критической ситуации, и вам нужно только знать, существует ли оно и где оно, вы можете использовать locate
. Он хранит базу данных всех файлов в каталогах, о которых вы сказали, для сбора информации.
При установке по умолчанию (в Ubuntu) locate
настраивается ежедневное cron
задание, которое сканирует файловую систему и обновляет базу данных ...
Если вы чувствуете, что вам нужно обновить базу данных до следующего обновления cron, обычно это быстрее, чем find
или ls
просто запустить, sudo updatedb
а затем locate
. Это определенно быстрее, если вам нужно больше искать ... как следует из названия, updatedb
обновляет базу данных, которая locate
использует ...
locate
имеет встроенное регулярное выражение, что делает его очень удобным ... Я буду использовать find
в сценарии, но я редко использую find
в командной строке. Я даже использую locate
в (личных) сценариях ... например.locate -bir "oo.*datt.*mp4$"
locate
возвращает полные пути сопоставленных файлов.
find [path] -name [filename]
Например, если я хочу найти в каталоге / home имя файла, содержащего foo, я бы использовал команду:
find /home -name *foo*
используйте команду man find
для получения дополнительной информации о команде find и аргументах,
*
s, чтобы оболочка не интерпретировала их.
ls
?