Как найти файл в файловой системе из командной строки?

Я довольно новичок в Linux, и теперь я оказался в ситуации, когда мне хотелось найти, где файл (с частично известным именем файла) находится в файловой системе. Я хотел бы знать, как это сделать из командной строки, вместо использования утилиты GUI.

В Windows я бы запускал следующее:

cd /d C:\ dir *filename* /s 

Что такое эквивалент Linux?

 locate filename find -name '*filename*' echo **/*filename* ls -ld **/*filename* 

(Ознакомьтесь с основными положениями и условиями. Ознакомьтесь с руководством по мелкому шрифту.)

Листинг содержимого каталога является второстепенной особенностью ls . Основная задача ls , которая занимает большую часть своей сложности, – это тонкая настройка дисплея. (Посмотрите руководство и сравните количество опций, связанных с выбором файлов для отображения, и количеством опций, которые определяют, какую информацию отображать о каждом файле, и как форматируется дисплей. Это верно как для GNU ls , можно найти в Linux и других системах с меньшим количеством вариантов, начиная с первых дней.)

Режим ls умолчанию заключается в том, что когда вы передаете ему каталог, он перечисляет файлы в этом каталоге. Если вы передаете ему любой другой тип файла (обычный файл, символическую ссылку и т. Д.), Он перечисляет только этот файл. (Это относится к каждому аргументу отдельно.) Параметр -d указывает, что никогда не будет спускаться в каталог.

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 . См. Руководство для многих других опций.

Обычная команда поиска файла в дереве каталогов находится. Он поставляется с множеством опций для контроля того, какие файлы отображаются и что с ними делать. Например, для поиска файлов, чье имя соответствует шаблону *filename* в текущем каталоге и его подкаталогах и печатает их имена:

 find /some/dir -name '*filename*' -print 

-print – действие (большинство других действий состоит из выполнения команды в файле); если вы не ввели действие, подразумевается -print . Кроме того, если вы не укажете какую-либо директорию для перемещения ( /some/dir выше), подразумевается текущий каталог. Условие -name '*filename' говорит, чтобы список (или действовать) только файлы, имя которых соответствует этому шаблону; есть много других фильтров, таких как -mtime -1 чтобы соответствовать файлам, измененным за последние 24 часа. Иногда вы можете опускать кавычки в -name '*filename*' , но только если подстановочный знак не соответствует ни одному файлу в текущем каталоге (см. Выше). В общем, короткая форма

 find -name '*filename*' 

Другой полезный инструмент, когда вы знаете (часть) имя файла, находится. Этот инструмент запрашивает базу данных имен файлов. В типичных системах он обновляется каждую ночь. Преимущество locate над find / заключается в том, что он намного быстрее. Недостатком является то, что его информация может быть устаревшей. Существует несколько реализаций locate которые отличаются поведением в многопользовательских системах: базовая программа locate индексирует только общедоступные файлы (вы можете захотеть запустить companion updatedb чтобы создать вторую базу данных, которая индексирует все файлы в вашей учетной записи) ; есть другие версии (mlocate, slocate), которые индексируют все файлы и имеют локальную программу, фильтрующую базу данных, чтобы возвращать только файлы, которые вы можете видеть.

 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 и аргументах,