Я довольно новичок в 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 и аргументах,