знайти команду в Linux для пошуку файлів PDF


11

Моя мета - знайти всі файли PDF на віддаленій машині, тому я вдаюся до корисної команди find. Тому я набираю

знайти ~ * .pdf
або
знайти ~ "* .pdf"
і я нічого не отримую. Я роблю те саме на своїй машині і нічого не отримую. Я регулярно шукаю в меню на своїй машині і знаходжу досить багато файлів у форматі PDF. Хтось, будь ласка, скаже мені, що я роблю не так?


11
Не тримайте негативної думки поза вашим запитанням, якщо хочете хорошої відповіді. У спорідненій історії findце далеко не даремно.
wilhelmtell

8
Звичайно, ви маєте право на свободу слова. Але ти хочеш хорошої відповіді, правда? Ні, ви не маєте права на гарну конструктивну відповідь. Це привілей.
wilhelmtell

2
Поганий робітник завжди звинувачує свої інструменти. Іншими словами, чистий PBCAK тут.
Паскаль Тивеннт

5
@Wilhelmtell, я вважаю, що твердження Мартіна справедливе - команда ніколи не повинна була називатися "знайти" в першу чергу, більше схожа на "walkpath_and_execute" ... вона не має найбільш інтуїтивного або зручного для користувача інтерфейсу і робить набагато більше ніж просто знайти файли. Просте ім'я "знайти" оманливе тим, що воно пропонує простий інтерфейс, якого у нього немає. Звичайно, пошук далеко не марний і працює досить добре, але навряд чи можна звинуватити новачка в тому, що він не знає різниці між "знайти", "знайти", "який" і т. Д.
Майкл Аарон Сафян

1
@Michael Я нікого тут не звинувачував; або, вірніше, я не був винним тут. Я навіть не сказав, що findце інтуїтивно. Я, мабуть, міг би сказати те саме, ніжним тоном; іноді я реагую на (дурні) негативні коментарі.
wilhelmtell

Відповіді:


30

findдалеко не марний. Ви просто не використовуєте його належним чином.

спробуйте:

find . -type f -iname '*.pdf'


@Martin - Раді допомогти, просто обов'язково позначте питання як відповідь!
Мітч Демпсі

@stepancheg Так, чому б вам не зняти Інтернет та не надрукувати паперову копію.
бобобобо

9

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

find . -type f -iname '*.pdf' 

Команда, наведена вище, означає «знайти всередині. Команда find може бути фактично використана для виконання команд на знайдених файлах (замість або додатково до друку імен файлів). Однак для ваших цілей вам може бути зручніше команда locate , яка - якщо припустити, що ви створили базу даних locate за допомогою updateb - дуже легко знаходити файли. Наприклад:

locate '*.pdf'

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


6

Вам просто не вистачає присудка, який говорить про те, що ви шукаєте (наприклад, -name)

Щоб знайти в домашньому каталозі по імені:

find ~ -name \*.pdf

Зауважте, що підстановку *потрібно уникати, щоб оболонка не інтерпретувала її, перш ніж знайти на неї руки. Використання '*.pdf'та "*.pdf"матиме такий же ефект, як і \*.pdf.

Щоб знайти нечутливий регістр:

find ~ -iname \*.pdf

Обрізати результати лише на файли (вираз з іменем, мабуть, піклується про це за вас, але про всяк випадок, якщо у вас є якісь дивно названі каталоги):

find ~ -type f -iname \*.pdf

Щоб переконатися в пошуку наступних символьних посилань (зазвичай я хочу це робити сам під час пошуку):

find ~ -follow -type f -iname \*.pdf

Щоб зробити щось із знайденими файлами: ви можете скинути це у файл, використовуючи перенаправлення stdout (наприклад, торкнутись > filenameв кінці) або скористатися -execопцією для запуску команди (детальну інформацію див. На сторінці man). Останній запускає команду по кожному файлу одночасно. часто швидше дозволити xargsкоманді передавати знайдені файли як аргументи іншій команді, всі відразу або великі шматки. Наприклад, для ad-hoc (але невкладених) перехоплення через файли заголовка:

find ~ -follow -type f -name \*.h | xargs grep -nH "identifier"

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

find ~ -follow -type f -name \*.h -print0 | xargs -0 grep -nH "identifier"

Насправді "* .pdf" розшириться, якщо в поточному каталозі є файли, що закінчуються .pdf, правда? (другорядна примітка)
Петро Ярич

1
Не в баш. З посібника з bash: "Закриття символів у подвійних лапках зберігає буквальне значення всіх символів у лапках, за винятком [долар], [зворотне котирування], [труба] та, коли розширення історії включено, [баг]. " Спробуйте самостійно підтвердити: ls "* .txt" у каталозі з текстовими файлами в ньому.
Оуен С.

Так, ви праві, звичайно. Я не знаю, звідки я взяв цю ідею. Дякуємо, що виправили мене.
Петро Ярич

3

погляньте на цей підручник

я думаю, що ти хочеш це зробити

find . -name "*.pdf"

Вам слід використовувати inameатрибут для кращого зору передпокою
Мітч Демпсі

0

Раніше я поєднував знахідку з подібними грепами

знайти. . | grep -i ".pdf"

можливо, це не найефективніше, але це добре справляється.


Це може бути зроблено findбезпосередньо , якщо ви хотіли, з допомогою -iregex: find ~ -iregex '.*\.pdf'. Проблема полягає в тому, що в findшаблоні трактується так, як у нього завжди ^спереду і в $задній частині, тому ваш візерунок повинен бути дещо складнішим. Також зауважте: .у вашому зразку є фактично однозначний знак, а не буквальний період.
Оуен С.

0

Знайдіть потрібні файли протягом останніх x днів

find ~ -type f -iname '*.pdf' -mtime -1

знайде файли pdf у вашому домашньому ~каталозі та нижче із розширенням .pdfнезалежно від верхнього та нижнього регістру (це я в iname) та змінено до 1 дня тому, тому що я додав mtime -1; якщо поставити -60 в mtime, це буде останні 60 днів.


0

Для виконання пошуку в "знайдених" файлах існує така конструкція:

find <dir> -type f -iname <name> -exec grep -H <string> {} \;

Команда exec повинна закінчуватися втечею ";" і -H необхідний для grep, щоб роздрукувати шлях до файлу на додаток до рядка у файлі, де "рядок".

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