команда знаходити файли, шукаючи лише частину їх імен?


32

Скажіть, що є файли з іменами:

batman.c
debate.c
cricketbat.c

Яка команда і як я можу використовувати її для переліку всіх цих файлів за допомогою тегу пошуку bat?


5
Ви хочете перелічити відповідні файли лише в поточному каталозі? в будь-якому каталозі в поточному каталозі або нижче? де-небудь в системі?
steeldriver

Відповіді:


47

Пошук файлів з batбудь-якого місця

Щоб знайти всі файли в будь-якому місці, /path/to/folderчиї імена містяться bat, ви можете використовувати:

find /path/to/folder -name '*bat*'

Я цитував шаблон пошуку , *bat*тому що, якщо котирування були опущені і файли збігаються *bat*в поточному каталозі, то оболонка розширюватиметься *bat*в їх список і передати , що до find. Тоді findб нічого не вийшло. ( \*bat\*а "*bat*"також працювати.)

Для пошуку в папці, в якій ви зараз перебуваєте (наприклад, у якій ви cdредагували), використовуйте ., як завжди:

find . -name '*bat*'

Для пошуку всього комп’ютера використовуйте/ . Для пошуку в домашньому каталозі використовуйте ~або повне ім’я домашнього каталогу. ( Оболонка розширюється~ до повноцінного шляху вашого домашнього каталогу.)

Розширення або звуження вашого пошуку на основі назви

Якщо ви хочете шукати без регістру, щоб файли, що містять BAT, bAtі так далі, збігаються, використовуйте -inameтест замість -nameтесту:

find /path/to/folder -iname '*bat*'

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

find /path/to/folder -name '*bat*.c'

Я помітив, що всі ваші імена файлів є batабо на самому початку, або в самому кінці частини, що передує .cсуфіксу. Якщо ви хочете уникнути відповідності таких файлів embattled.c, ви можете використовувати:

find /path/to/folder -name '*bat.c' -o -name 'bat*.c'

-oє або оператором.

Узгодження лише файлів

Щоб знайти лише звичайні файли - а не папки, символічні посилання та спеціальні вузли пристроїв - ви можете використовувати -type f. Це часто рекомендується, а іноді і цілком доречно ... але часто не те, що ви дійсно хочете , особливо якщо ви працюєте findз метою самостійного вивчення результатів. Якби у вас було символічне посилання, яке відповідало вашому пошуку, не хотіли б ви про це знати?

Якщо ви хочете знайти як звичайні файли, так і символічні посилання, ви можете скористатися:

find /path/to/folder -name '*bat*' \( -type f -o -type l \)

Це використовує -oоператор, а також круглі дужки для групування (що повинно бути цитувано, щоб оболонка не зверталася до них спеціально; інакше ви отримаєте синтаксичну помилку).

Але припустимо, ви хочете бачити лише символічні посилання, які в кінцевому підсумку вказують на звичайний файл (а не символічні посилання на каталоги, вузли пристроїв тощо). Це насправді навіть простіше: використовувати -xtypeзамість -type. Якщо ви не працюєте findз -Lпрапором, -xtypeсимволічне посилання перевіряє тип файлу, на який вказує посилання.

find /path/to/folder -name '*bat*' -xtype f

Якщо у вас є посилання на інше символьне посилання на файл, воно -xtype fбуде відповідати, навіть якщо його пряма мета - це інше символьне посилання, а не звичайний файл. Це майже завжди те, що ви хочете.

Часто люди думають, що хочуть -type f, але насправді вони хочуть -xtype f.

Отримання детального результату

findдію за замовчуванням, якщо ви не вказали, є -print. Усі команди, наведені вище, еквівалентні самим собі, з -printпозначкою в кінці.

findчасто використовується для запуску команд на основі знайдених файлів - часто це команди, які вносять зміни. Але є й інші дії, метою яких є окрім результатів -print. Особливий інтерес викликає -ls:

find /path/to/folder -name '*bat*' -ls

Це дає детальну інформацію про кожен файл у форматі з декількома стовпцями, схожим на (хоча і не зовсім такий, як), який ви побачили, запустивши .ls file

Подальше читання

Для отримання додаткової інформації про findта інші способи пошуку файлів див.


1
Прекрасна відповідь, особливо -xtypeпоради; можливо, ls *bat*і -maxdepth/ mindepthтакож варто згадати.
mklement0

2
@ mklement0 Дякую! Оперативна програма ще не надала роз'яснень щодо того, де знаходяться файли та чи потрібна рекурсія чи ні. Оскільки відповідь на хаосls уже висвітлювалась , я зосередився на рекурсивному випадку, що findтут. Звичайно, також буде корисною детальною відповіддю, що охоплює не (або менше) -рекурсивний перелік імен файлів, що відповідають деякому шаблону ( lsі findз -maxdepth). Ви можете опублікувати таку відповідь!
Елія Каган

16

Найпростіший спосіб - бігати

locate bat

Таким чином ви можете шукати на всьому комп’ютері файли, що містять "bat" у назві файлу

Щоб оновити список файлів на вашому ПК, запустіть

updatedb

Запустіть цю команду, коли ви нещодавно додали нові файли до свого облікового запису


1
потребиupdatetdb
Сергій Колодяжний

4
@Serg Щоб знайти нові файли (новіші, ніж останній раз updatedbвостаннє або автоматично було запущено), sudo updatedbпотрібно запустити спочатку, так.
Ілля Каган

Зауважте, що це буде шукати у всій системі відповідність імен bat.
тердон

1
@terdon Я вже заявив це у відповіді, не думаю, що він заслужив перемогу, коли я вже заявив про це.
Марк Кірбі

1
Зауважте, що це ЛОТИШЕ швидше, ніж find /при locateпошуку в базі даних, в той час як findрекурсивно перераховується, /а потім відповідає регексу.
Тимофі Гу

14

Відкрийте термінал і змініть каталоги в каталог, з якого ви хочете почати пошук, а потім запустіть цю команду:

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

.Починає команди пошуку з поточного каталогу. Відповідає рядку і є чутливим до регістру. ( Чутливий до регістру) В пошук файлів тільки.
-namebat-iname
-type f


видалити та відновити? ок +1: P;)
AB

6

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

$ ls *bat*
batgirl.c  batman.c  batwoman.c  cricketbat.c

Або (мати їх по рядку):

$ ls -1 *bat*
batgirl.c
batman.c
batwoman.c
cricketbat.c

Якщо ви хочете шукати в системі для цих файлів, використовуйте:

$ find / -name "*bat*"
/path/to/cricketbat.c
/path/to/batgirl.c
/path/to/batwoman.c
/path/to/batman.c

1
Якщо ваш пошук починається з кореневого каталогу, ви, можливо, захочете додати sudo, оскільки ця команда повідомляє "Дозвіл відхилено" для деяких папок
Сергій Колодяжний

4

Ви хочете скористатися findкомандою з -inameможливістю збігу імен файлів, нечутливих до регістру, або з -nameможливістю збігу імен файлів, залежних від регістру. Обидва вони дозволять вам використовувати імена підстановки. Отже, щоб знайти будь-які імена файлів, які містять "bat", ви б використовували:

find / -iname '*bat*'

Або

find / -name '*bat*'

В *означає «будь-який символ (и)», тому пошук шукає batз будь-якими символами, не включаючи жодного, до або після нього. В /пошук з кореневого каталогу рекурсивно, ви можете використовувати , .який буде шукати рекурсивно з поточного каталогу або абсолютний шлях для того, де ви хочете , щоб знайти. Погляньте, як шукати файли за допомогою regex в скрипті оболонки Linux


@EliahKagan дякую, я додав ще трохи інформації до своєї відповіді.
AJefferiss

+1 Дякую за редагування IMO - це сильна відповідь на те, що він уникає рекомендувати безрозбірливе використання -type f, що робить більше, ніж просто виключати каталоги і часто не є тим, чого користувачі дійсно хочуть .
Елія Каган

2

Користуйся добрим старим find.

find <path_for_search> -type f -iname "*bat*" 

напр .:

% find . -type f -iname "*bat*" 
./batgirl.c
./batwoman.c
./cricketbat.c
./batman.c

від man find:

-type c
          File is of type c:
          [..]
          d      directory
          [..]
          f      regular file
          [..]

-iname pattern 
          Like -name, but the match is case insensitive.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.