Як знайти файл з будь-якого каталогу


22

Я намагаюся шукати файл під назвою Book1 .

У своєму тесті я намагаюся шукати вищезгаданий файл, і в цьому тесті я не знаю, де знаходиться цей файл.

Я спробував, find / -iname book1але виходу немає.

Як я можу знайти свій файл під назвою book1 за допомогою командного рядка, якщо я не знаю, де знаходиться цей файл?

Редагувати:

Мій сценарій більш докладно описаний нижче:

  1. Розширення файлу невідомо
  2. Точна назва (тобто великі літери, цифри тощо) невідома
  3. Місце знаходження файлу невідоме

2
Якщо є файл, який називається Book1, і він знаходиться в каталозі, який ви можете прочитати, то find / -iname book1знайдете його. Ви впевнені, що це насправді Book1, а ні Book1.xyz?
Фокс

Повна назва файлу - Book1.gnumeric. Ви хочете сказати, що я повинен вказати всю назву файлу? Чомусь я подумав, що для цієї конкретної команди, що мені все потрібно - це загальна назва файлу. Мій тест намагається знайти файл, якщо, наприклад, я не пам’ятаю розширення файлу і знаю лише назву файлу, який я шукаю. Порадьте, будь ласка.
Aspire27

@don_crissti Готово. Дивіться вище Редагувати.
Aspire27

Ви змішуєте find і locate. locateє щедрим і знайде все, що відповідає, доки він знаходиться в його базі даних, яка зазвичай оновлюється щодня. find, у цьому випадку шукає файл-глобус, такий шаблон, який ви б використовували ls. Ви, мабуть, маєте на увазі iname '*book1*'. Зауважте, що шаблон повинен бути всередині лапок, щоб запобігти розширенню оболонки перед тим, findяк побачити її. Також зауважте, що find, як і багато команд * nix, розчаровує мовчання, коли це не вдається.
Манго

Відповіді:


31

По-перше, аргументом до -inameє шаблон оболонки . Ви можете прочитати більше про шаблони в Баш керівництві . Суть полягає в тому, що для того, findщоб насправді знайти файл, ім'я файлу повинно відповідати заданому шаблону. Для того, щоб регістронезавісімого рядок book1матчу Book1.gnumericви повинні або додати , *так це виглядає наступним чином :

find / -iname 'book1*'

або вкажіть повне ім’я:

find / -iname 'Book1.gnumeric'

По-друге, -inameзроблять findігнорувати випадок імені файлу, тому, якщо ви вказали, -iname book1він може також знайти Book1і bOok1т. Д. Якщо ви впевнені, що шуканий файл називається, Book1.gnumeric тоді не використовуйте, -inameале -nameце буде швидше:

find / -name 'Book1.gnumeric'

По-третє, пам’ятайте про цитування шаблону, як сказано в іншій відповіді .

І останнє - ви впевнені, що хочете шукати файл скрізь у своїй системі? Можливо, файл, який ви шукаєте, насправді знаходиться у вашому $HOMEкаталозі, якщо ви працювали над ним або завантажували його звідкись. Знову ж таки, це може бути набагато швидше.

Редагувати :

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

find / -iname 'book1*'

Я також пропоную розмістити 2>/dev/nullв кінці рядка, щоб приховати всі *permission denied*та інші помилки, які будуть мати місце, якщо ви посилаєтесь findяк не-root користувач:

find / -iname 'book1*' 2>/dev/null

І якщо ви впевнені, що шукаєте один файл, а у вашій системі є лише один файл, який відповідає критеріям, з яких ви можете сказати, findщоб вийти після пошуку першого відповідного файлу:

find / -iname 'book1*' -print -quit 2>/dev/null


6

Ви можете спробувати locateкоманду. Він використовує базу даних з іменами, щоб зробити пошук швидшим.

Щоб шукати всі відповідність файлів *book1*та ігнорувати регістр, ви можете використовувати

locate -i book1

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

locate -i 'book1*'

Це набагато швидше find, але лише настільки сучасне, як і востаннє, коли база даних оновлювалася.


5

Якщо ви знаєте, що у вас є названий файл book1.something, де розташування файлу, точне значення somethingта шаблон великої літери імені файлу невідомі:

find / -iname 'book1.*'

Якщо все, що ви точно знаєте, це те, що ім'я файлу містить слово book, ви можете створити набагато більший список

find / -iname '*book*'

Аргументом -nameє глобальний зразок оболонки. Зі каталогу, у якому знаходиться файл, порівняйте:

$ ls Book1
ls: cannot access 'Book1': No such file or directory
$ ls Book1.*
Book1.gnumeric

Це відображає тип пошуку, який здійснює -name. Цей -inameваріант просто дозволяє невідчутну до регістру версію цього.


1

POSIXly,

LC_ALL=C find / -name '*[bB][oO][oO][kK]1*'

Повідомить шлях всіх файлів, ім'я яких містить book1(з будь-якої варіації випадку, але з огляду на тільки ASCII латинські символи bokBOK, а не багато інших варіантів в Unicode , як 𝗄, 𝚔, 𝘬, , , , і всі їхні варіації з діакрітікой ...) в всі каталоги, до яких ви читали доступ.


0

Для таких завдань я завжди виконую: find / -iregex '.*Book1.*'

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

Головна відмінність: якщо це можливо, бути більш суворими , ніж просто використання /, як намагаються тільки /homeчи так, інакше ви будете спускатися в деяких каталогах, які не належать ( /sys, /devі т.д. ...)

Однак пам’ятайте, що застосовуються дозволи Unix: якщо файл знаходиться в каталозі, до якого користувач, який виконує findкоманду, не має права доступу (виконувати), findвін не зможе його знайти там.


iregex не працюватиме в таких місцях, як Solaris (ОС не вказано) (можливо, * BSD), це розширення GNU і не є частиною стандартуfind
Герт ван ден Берг

0

Silver Searcher - це дуже швидкий та зручний інструмент для пошуку файлів та вмісту.

Щоб вирішити вашу проблему, команда пошуку срібла виглядала б так ...

ag -g Book1

-g PATTERN Роздрукувати назви файлів, які відповідають PATTERN


0

locate і його варіанти, як правило, є швидким методом.

# updatedb # run as root, possibly using sudo, e.g. sudo -b updatedb. If file is on the system for more than a day it should already be in the index and this can be skipped
$ locate -i book1

Якщо пошук недоступний, ви можете використовувати його find. Це, як правило, набагато повільніше, але і набагато точніше.

Якщо у вас є один розділ: (запустіть як root, якщо ваш користувач може не мати доступу до файлу)

$ find / -xdev -iname 'book1*' -print # If the iname extension to find is available
$ find / -xdev -print | grep -F -i /book1 # if iname is not available

Якщо ви не включаєте -xdev findпошукові речі в інші розділи, як-от /procі /sys, які, як правило, заливають ваш екран помилками, особливо якщо ви не root. (Помилки можна приховати, додавши 2> /dev/nullв кінці команди find (коментар слід видалити))

Якщо у вас є декілька розділів, і ви не знаєте, на якому з файлів входить, ви можете отримати список lsblk(на ОС Linux, розбір dfрезультатів - це варіант інакше) і подати його на find: (коріть знову, якщо ви не знаю, чи можете ви отримати доступ до файлу)

$ find $(lsblk -O MOUNTPOINT -n | grep -F /) -xdev -iname 'book1*' -print # GNU-based OSes
$ find $(df -P|awk '$1 ~ /^\/dev/ {print $NF}') -xdev | grep -F -i book1 # Non-GNU based OSes.

(Це трохи неміцно, якщо в будь-якому з ваших монтових точок є пробіли) ( dfможе знадобитися настройка параметрів. -P змушує GNU dfдавати стандартний вихід POSIX. Інші версії можуть мати інші параметри або потребувати його залишити. Прочитайте сторінку чоловіка)

В grep -Fвиключає інші речі повернулися, як розділ підкачки.

У не-GNU-версії awk знайдіть пристрої з кріпленням, починаючи з /devотримання реальних файлових систем, а потім надрукуйте останнє поле (точку кріплення ) з dfвиводу.

Це також передбачає оболонку, що нагадує бурне ( kshі bashповинна працювати. Якщо ви використовуєте cshваріант, запустіть оболонку, що пишеться перед тим, як спробувати)


В greps може бути трохи шумно, навчитися фільтрувати краще (це не повинно бути необхідності в прикладі, але якщо це що - то більш загальне , що шукається, то відбирає потрібно буде налаштовувати , щоб зберегти рівень шуму вниз)
Герт van den Berg

0

ag (срібний пошук) забезпечує дуже швидкий пошук у файлах, а також має можливість пошуку імені файлу:

>: time ag -g foo # uses heuristics to only look in desired locations
apps/vxy/src/assets/tree-content-pages/tree-page-bird/foo-illustration.jpg

real    0m0.884s
user    0m0.701s
sys     0m0.178s

>: time find . -name "*foo*"
./apps/ssr/dist/static/media/foo-illustration.jpg
./apps/vxy/dist/static/media/foo-illustration.jpg
./apps/vxy/src/assets/tree-content-pages/tree-page-bird/foo-illustration.jpg

real    0m29.744s
user    0m2.108s
sys     0m13.982s

>: time ag -ug foo # searching all files is still faster and simpler to use then find command
apps/ssr/dist/static/media/foo-illustration.jpg
apps/vxy/dist/static/media/foo-illustration.jpg
apps/vxy/src/assets/tree-content-pages/tree-page-bird/foo-illustration.jpg

real    0m16.698s
user    0m1.951s
sys     0m7.119s

Тож у моєму випадку використання тут це> в 30 разів швидше, якщо файл не є ігнорованим аг.

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