Відповіді:
locate filename
find -name '*filename*'
echo **/*filename*
ls -ld **/*filename*
(Прочитайте основні умови. Читайте посібник з тонкого друку.)
Перерахування вмісту каталогу є своєрідною вторинною ознакою ls
. Основна робота ls
, яка займає більшу частину своєї складності, - це точна настройка дисплея. (Погляньте на посібник та порівняйте кількість варіантів, пов’язаних із вибором файлів для відображення, а також кількістю опцій, які керують інформацією для кожного файлу та форматуванням дисплея. Це справедливо як для GNU ls, які ви ' Ви знайдете в Linux та інших системах з меншою кількістю можливостей з перших днів.)
Режим за замовчуванням - ls
це те, що коли ви передаєте йому каталог, він перераховує файли в цьому каталозі. Якщо ви передаєте йому будь-який інший тип файлу (звичайний файл, символічне посилання тощо), він перераховує саме цей файл. (Це стосується кожного аргументу окремо.) Цей параметр -d
повідомляє ls
ніколи не спускатися в каталог.
ls
У нього є опція, -R
яка повідомляє їй рекурсивно перераховувати каталоги. Але це обмежена застосовність і не дозволяє багато фільтрувати на виході.
Першим інструментом для узгодження шаблону є сама оболонка. Вам не потрібна будь-яка інша команда: просто введіть ваші символи і ви налаштовані. Це відомо як глобус .
echo *filename*
Традиційно символи символів обмежувались поточним каталогом (або вказаним каталогом echo /some/where/*filename*
:). *
Відповідає будь-якому імені файлу, або будь-яку частину імені файлу, але *.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
робота, яка сканує файлову систему та оновлює базу даних ...
Якщо ви вважаєте, що вам потрібно оновити базу даних до наступного оновлення кронів, це зазвичай швидше, ніж 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
?