Як знайти файл у файловій системі з командного рядка?


10

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

У Windows я запустив би таке:

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

Що таке еквівалент Linux?


Ну, очевидно, існує більше, ніж один спосіб зібрати цю кішку. Мені все ще цікаво дізнатися, чи є спосіб це зробити ls?
Іссі

Відповіді:


13
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 .


Бажаю, щоб я міг знову проголосувати за це. Просто довелося шукати це для іншого проекту сьогодні ввечері. Ще раз дякую, @Gilles!
Іссі

6

еквівалент вашому прикладу DOS буде:

cd /
find . -name \*filename\* -print

В Linux, як правило, -printаргументи, як правило , більше не потрібні . Якщо ви виявите, що працюєте в інших операційних системах, про це може бути зручно.


5

Якщо ви хочете чогось "швидкого" , але не в критичній місії ситуації, і ви хочете знати лише, чи існує воно і де воно є, ви можете використовувати locate. Він зберігає базу даних усіх файлів у каталогах, про які ви сказали, щоб збирати інформацію.

У встановленні за замовчуванням (на Ubuntu) locateвстановлюється щоденна cronробота, яка сканує файлову систему та оновлює базу даних ...

Якщо ви вважаєте, що вам потрібно оновити базу даних до наступного оновлення кронів, це зазвичай швидше, ніж findабо lsпросто запустити sudo updatedbі потім locate. Це, безумовно, швидше, якщо вам потрібно зробити більше пошукових запитів ..., як випливає з назви, updatedbоновлення бази даних, яка locateвикористовує ...

locateмає вбудований регулярний вираз, що робить його дуже зручним ... Я буду використовувати findв сценарії, але я рідко використовую findв командному рядку. Я навіть використовую locateв (особистих) сценаріях ... наприклад.locate -bir "oo.*datt.*mp4$"

locate повертає повністю кваліфіковані шляхи відповідних файлів.


2
find [path] -name [filename]

Наприклад, якщо я хочу шукати в / home директорії по імені файлу, що містить foo, я використовував би команду:

find /home -name *foo*

використовуйте команду man findдля отримання додаткової інформації про команду find та аргументи,


3
Потрібно навести цитати або уникати *s, щоб оболонка не інтерпретувала їх.
Шон Дж. Гофф

Цей distro / shell специфічний? Я запускав його у Fedora 16 без втечі, і це спрацювало чудово.
josh-cain

1
У деяких оболонках є варіанти, які передають зірки разом із програмою, якщо вони не зустрічаються ні з чим. Спробуйте створити файл у вашому поточному каталозі, який відповідає цьому шаблону, і повторіть команду.
Шон Дж. Гофф
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.