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


1887

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

Відповіді:


2739

Використовуйте знахідку для цього:

find . -name "foo*"

findпотребує початкової точки, а .(крапка) вказує на поточний каталог.


21
Я знаю, що це позначено як Linux, але це варто згадати: шлях необхідний для інших * nix варіантів, які не є Linux. У Linux Linux шлях необов’язковий, якщо ви хочете використовувати крапку.
IslandCow

4
@Seatter "foo *" повідомляє знайти шукати всі файли, які починаються з "foo". Це лише його приклад. Ви можете використовувати "gpio *", щоб знайти всі файли, імена яких починаються з gpio, або просто "gpio1", щоб знайти всі файли з іменем gpio1.
schumacher574

29
зауважте, що "foo *" є в лапках, тому оболонка не розгортає її, перш ніж передавати її для пошуку. якби ви тільки що зробили find . foo*, foo*то розширили б, а потім перейшли до пошуку.
усмішка

32
Варто наголосити, що " "дуже необхідно для рекурсивного пошуку.
WesternGun

3
Також корисно: Якщо ви не хочете отримувати повідомлення про каталоги, у вас немає дозволу на (або інші помилки), ви можете зробити цеfind . -name "foo*" 2>/dev/null
Jobbo

221

Часто знайти зручніші труби в греп; це дає вам повну силу регулярних виразів для довільного зіставлення підстановок.

Наприклад, щоб знайти всі файли з нечутливою до регістру рядком "foo" у назві файлу:

~$ find . -print | grep -i foo

57
findтакож мають -iname, -regexі -iregexпрапори для регістронезавісімого шаблону, регулярного виразу, і нечутливих до регістру зіставлення регулярних виразів, так пекуче до grepнепотрібно.
іобендер

7
Я не думаю, що мова йде про непотрібність, але про те, щоб бути зручнішим.
Ілля Лінн

1
Однак, для передачі в файл grep -v ви можете використовувати прості рядки або регулярні вирази для видалення записів, які ви не хочете.
door_number_three

3
@iobender - На жаль, з досвіду можу сказати, що не всі системи мають findкоманду, яка підтримує ці параметри. Іноді grepстає єдиним варіантом.
Містер Лама

150

find знайде всі файли, які відповідають шаблону:

find . -name "*foo"

Однак, якщо ви хочете малюнок:

tree -P "*foo"

Сподіваюся, це допомагає!


18
brew install treeдля користувачів Mac OSX без apt-getвстановленої
версії

1
Тестовано на macOS Sierra, просто додайте «--print» -> «Знайти. назва "* foo" - друк ". superuser.com/questions/177289/searching-mac-through-terminal
john-salib

2
sudo yum встановити дерево -y для CentOS
Santosh Kumar

39
find -L . -name "foo*"

У кількох випадках мені знадобився параметр -L для обробки символічних посилань каталогів. За замовчуванням символічні посилання ігноруються. У цих випадках це було досить заплутано, оскільки я міняв би каталог в підкаталог і бачив файл, що відповідає шаблону, але знаходжу, що не повертає ім'я файлу. Використання -L вирішує цю проблему. Символічні параметри посилання для знаходження - -P -L -H


1
L перемикач дуже корисний. Багато разів користувач не має поняття про основні каталоги, будь то програмне забезпечення або вони є звичайними каталогами. Тож у разі сумнівів завжди добре використовувати варіант L. Принаймні, це мені завжди допомагало.
Ritesh

2
Це була відповідь для мене. Дякую!
iedmrc

33

Якщо ваша оболонка підтримує новий параметр глобалізації (можна ввімкнути :)shopt -s globstar , ви можете використовувати:

echo **/*foo*

щоб рекурсивно знаходити будь-які файли чи папки. Це підтримується Bash 4, zsh та подібними оболонками.


Особисто я визначив цю функцію оболонки:

f() { find . -name "*$1*"; }

Примітка. Наведений рядок можна вставити безпосередньо в оболонку або додати у ~/.bashrcфайл користувача.

Тоді я можу шукати будь-які файли, ввівши:

f some_name

Крім того, ви можете використовувати fdутиліту з простим синтаксисом, наприклад fd pattern.


1
Це просто переходить у єдиний рівень. Не повторюючись для мене в
підкаталогах

3
@Broncha Тому що вам потрібно активувати розширений глобул за допомогою shopt -s globstarкоманди. Це підтримується в Bash, zsh та подібних оболонках.
kenorb

bash-3.2$ shopt -s globstarдаєbash: shopt: globstar: invalid shell option name
мальовничий

@drewish Вам потрібно оновити Bash до 4.x
kenorb

echo * / * foo менш швидкий, ніж знайти
Йозеф Климук

31

fd

У випадку, якщо findце занадто повільно, спробуйте fdутиліту - просту і швидку альтернативу findнаписаному в Rust.

Синтаксис:

fd PATTERN

Демонстрація:

Домашня сторінка: https://github.com/sharkdp/fd


17
Вперше я бачив gif на SO майже за 9 років. Хороша робота!
Джошуа Пінтер

1
Ці результати роботи виглядають дуже перспективно. Ви можете розглянути можливість додавання fd до домашньої заварки ...
Gr3go,

off topic: який інструмент ви використовували для створення svg-файлу для демонстрації?
апродан

2
@aprodan Демонстраційне зображення було скопійовано з GitHub, але я вважаю, що вони використовують asciinema, а потім перетворено у формат GIF, але я не впевнений.
kenorb

1
Насправді це формат SVG, тому, ймовірно, asciicast2vectorйого можна використовувати.
kenorb

27
find <directory_path>  -type f -name "<wildcard-match>"

У підстановці підстановок ви можете вказати рядок, який ви хочете відповідати, наприклад * .c (для всіх файлів c)


1
Ваша відповідь є першою найбільш правильною тут, оскільки вона здійснює пошук лише файлів, як зазначено. Інші, що не вказують тип, повертають каталоги.
wilsotc

якщо ви хочете шукати каталог "-типу f" можна змінити на "-тип d"
XYZ_Linux

11

Ви можете використовувати:

# find . -type f  -name 'text_for_search'

Якщо ви хочете використовувати REGX використання -iname

# find . -type f  -iname 'text_for_search'

9

Наступна команда відобразить список усіх файлів, які мають точну назву "pattern" (наприклад) у поточній та її підпапках.

find ./ -name "pattern"


8

Типовим способом пошуку рекурсивного файлу, який доступний у більшості випадків, є

find . -name "filepattern"

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

man find

або якщо підручні сторінки недоступні у вашій системі

find --help

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

sudo updatedb

І використовувати його для пошуку певного типу файлів

locate filename

Або, щоб шукати ім’я файлу чи малюнок у поточному каталозі, можна ввести:

 pwd | xargs -n 1 -I {} locate "filepattern"

Він перегляне свою базу даних файлів і швидко роздрукує імена шляхів, що відповідають шаблону, який ви ввели. Щоб переглянути повний список параметрів пошуку, введіть: locate --helpабоman locate

Крім того, ви можете налаштувати locate для оновлення своєї бази даних у заплановані часи через роботу cron, тому зразок cron, який оновлює db в 1:00, виглядатиме так:

0 1 * * * updatedb

Ці завдання в Cron повинні бути налаштовані під root, оскільки updateb потребує привілею root для переходу всієї файлової системи.


7

для пошуку файлів
find / -xdev -name settings.xml -> весь комп'ютер
find ./ -xdev -name settings.xml -> поточний каталог та його підкаталог

для файлів з типом розширення

find . -type f -name "*.iso"

6

Я здивований, побачивши, що locate не використовується сильно, коли ми маємо пройти рекурсивно.

Я спершу знайду "$ PWD", щоб отримати список файлів у поточній папці, що цікавить, а потім запустити файли на них, як мені заманеться.

locate "$PWD" | grep -P <pattern>

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


locate "$PWD*.mp4" Просто нагадую, що ви можете пропустити grep
печеру

5

Знизу команда допомагає шукати будь-які файли

1) Незалежно від випадку
2) Результат Виключення папок без дозволу
3) Пошук у корені чи з потрібного вам шляху. Змінити / з кращим шляхом.

Синтаксис:
find -iname '' 2> & 1 | grep -v " Приклад відхилено"


знайти / -iname 'C * .xml' 2> & 1 | grep -v "У дозволі відмовлено"

find / -iname '*C*.xml'   2>&1 | grep -v "Permission denied"

1
чому на землі ви використовуєте греп для цього? Просто перенаправляйте stderr на nullfind / -iname '*C*.xml' 2>/dev/null
phuclv

3

Якщо ви хочете шукати спеціальний файл з підстановкою, ви можете використовувати наступний код:

find . -type f -name "*.conf"

Припустимо, ви хочете шукати тут усі файли .conf:

.означає пошук, розпочатий звідси (поточне місце)
-typeозначає тип елемента пошуку, який тут є файлом (f).
-nameозначає, що ви хочете шукати файли з іменами * .conf .


3

Це дозволить шукати всі пов'язані файли в поточному та підкаталогах, обчислюючи їх кількість рядків окремо, а також повністю:

find . -name "*.wanted" | xargs wc -l

2

Використовуйте

find path/to/dir -name "*.ext1" -o -name "*.ext2"

Пояснення

  1. Перший параметр - це каталог, який ви хочете шукати.
  2. За замовчуванням findвідбувається рекурсія.
  3. -oЧи означає -or. Отже, вище означає пошук цієї підстановки АБО цього. Якщо у вас є лише один зразок, тоді не потрібно -o.
  4. Цитати навколо шаблону підстановки обов'язкові.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.