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