Скажіть, що є файли з іменами:
batman.c
debate.c
cricketbat.c
Яка команда і як я можу використовувати її для переліку всіх цих файлів за допомогою тегу пошуку bat
?
Скажіть, що є файли з іменами:
batman.c
debate.c
cricketbat.c
Яка команда і як я можу використовувати її для переліку всіх цих файлів за допомогою тегу пошуку bat
?
Відповіді:
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
та інші способи пошуку файлів див.
find
керівництва , доступна в Інтернеті або за допомогою запуску man find
в терміналі.find
, locate
і xargs
комунальні послуги.-xtype
поради; можливо, ls *bat*
і -maxdepth
/ mindepth
також варто згадати.
ls
уже висвітлювалась , я зосередився на рекурсивному випадку, що find
тут. Звичайно, також буде корисною детальною відповіддю, що охоплює не (або менше) -рекурсивний перелік імен файлів, що відповідають деякому шаблону ( ls
і find
з -maxdepth
). Ви можете опублікувати таку відповідь!
Найпростіший спосіб - бігати
locate bat
Таким чином ви можете шукати на всьому комп’ютері файли, що містять "bat" у назві файлу
Щоб оновити список файлів на вашому ПК, запустіть
updatedb
Запустіть цю команду, коли ви нещодавно додали нові файли до свого облікового запису
updatetdb
updatedb
востаннє або автоматично було запущено), sudo updatedb
потрібно запустити спочатку, так.
bat
.
find /
при locate
пошуку в базі даних, в той час як find
рекурсивно перераховується, /
а потім відповідає регексу.
Відкрийте термінал і змініть каталоги в каталог, з якого ви хочете почати пошук, а потім запустіть цю команду:
find . -name "*bat*" -type f
.
Починає команди пошуку з поточного каталогу. Відповідає рядку і є чутливим до регістру. ( Чутливий до регістру)
В пошук файлів тільки.-name
bat
-iname
-type f
Якщо файли знаходяться в поточному каталозі, використовуйте:
$ 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
Ви хочете скористатися find
командою з -iname
можливістю збігу імен файлів, нечутливих до регістру, або з -name
можливістю збігу імен файлів, залежних від регістру. Обидва вони дозволять вам використовувати імена підстановки. Отже, щоб знайти будь-які імена файлів, які містять "bat", ви б використовували:
find / -iname '*bat*'
Або
find / -name '*bat*'
В *
означає «будь-який символ (и)», тому пошук шукає bat
з будь-якими символами, не включаючи жодного, до або після нього. В /
пошук з кореневого каталогу рекурсивно, ви можете використовувати , .
який буде шукати рекурсивно з поточного каталогу або абсолютний шлях для того, де ви хочете , щоб знайти. Погляньте, як шукати файли за допомогою regex в скрипті оболонки Linux
-type f
, що робить більше, ніж просто виключати каталоги і часто не є тим, чого користувачі дійсно хочуть .
Користуйся добрим старим 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.