найти команду в Linux, чтобы найти PDF-файлы

11

Моя цель - найти все файлы pdf на удаленной машине, поэтому я прибегаю к полезной команде find. Так я набираю

найти ~ * .pdf
или
найти ~ "* .pdf"
и я ничего не получаю. Я делаю то же самое на своей машине и ничего не получаю. Я делаю регулярный поиск по меню на моем компьютере, и я нахожу довольно много PDF-файлов. Кто-нибудь, пожалуйста, скажите мне, что я делаю не так?

Акира
источник
11
Держите свои негативные мнения вне вопроса, если вы хотите получить хороший ответ. В связанной истории, findэто далеко не бесполезно.
Вильгельмтель
8
Конечно, у вас есть право на свободу слова. Но вы хотите хороший ответ, верно? Нет, у вас нет права на хороший конструктивный ответ. Это привилегия.
Вильгельмтель
2
Плохой рабочий всегда обвиняет свои инструменты. Другими словами, чистый PBCAK здесь.
Паскаль Thivent
5
@Wilhelmtell, я думаю, что утверждение Мартина справедливо - команда никогда не должна была называться «найти» в первую очередь, больше похоже на «walkpath_and_execute» ... она не имеет наиболее интуитивного или удобного интерфейса и делает гораздо больше чем просто найти файлы. Простое имя «найти» обманчиво в том смысле, что оно предлагает простой интерфейс, которого у него нет. Конечно, поиск далеко не бесполезен и работает довольно хорошо, но вряд ли можно винить новичка в том, что он не знает разницы между «найти», «найти», «который» и т. Д.
Майкл Аарон Сафян
1
@ Майкл, я никого не обвинял здесь; или, скорее, я не был тем, кто обвиняет здесь. Я даже не сказал, findчто интуитивно понятно. Я мог бы, вероятно, сказать то же самое более приятным тоном; иногда я реагирую на (глупые) негативные комментарии.
Вильгельмтелл

Ответы:

30

findдалеко не бесполезен. Вы просто не используете это должным образом.

пытаться:

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

Митч Демпси
источник
@Martin - рад помочь, просто пометьте вопрос как ответивший!
Митч Демпси
@stepancheg Да, почему бы вам не отключить Интернет и не распечатать бумажный экземпляр.
бобобо
9

Посмотрите на документацию по findutils . findКоманда является невероятно мощным и, следовательно, имеет довольно сложный интерфейс. Вы можете делать то, что вы хотите с:

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

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

locate '*.pdf'

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

Майкл Аарон Сафян
источник
6

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

Найти в домашнем каталоге по имени:

find ~ -name \*.pdf

Обратите внимание, что подстановочный знак *должен быть экранирован, чтобы оболочка не интерпретировала его до того, как find получит его. Использование '*.pdf'и "*.pdf"будет иметь тот же эффект, что и \*.pdf.

Чтобы найти без учета регистра:

find ~ -iname \*.pdf

Чтобы обрезать результаты только по файлам (выражение имени, вероятно, позаботится об этом за вас, но на случай, если у вас есть какие-то странно названные каталоги):

find ~ -type f -iname \*.pdf

Чтобы убедиться, что find идет по символическим ссылкам (я обычно хочу сделать это сам при выполнении поиска):

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

Чтобы сделать что-то с найденными вами файлами: вы можете сбросить это в файл, используя перенаправление stdout (например, прикрепить > filenameв конце), или использовать -execопцию для запуска команды (см. Man-страницу для подробностей). Однако последний запускает команду для каждого файла за раз. часто быстрее позволить xargsкоманде передать найденные файлы в качестве аргументов другой команде, все сразу или большие куски за раз. Например, для специальных (но неиндексированных) операций поиска в файлах заголовков:

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: «Заключение символов в двойные кавычки сохраняет буквальное значение всех символов в кавычках, за исключением [dollar], [backquote], [pipe] и, когда расширение истории включено, [bang]. " Попробуйте сами подтвердить: ls "* .txt" в каталоге с текстовыми файлами в нем.
Оуэн С.
Да, вы правы, конечно. Я не знаю, откуда у меня эта идея. Спасибо, что поправили меня.
Питер Ярич
3

взгляните на этот урок

я думаю, что вы хотите сделать, это

find . -name "*.pdf"

источник
Вы должны использовать inameатрибут для лучшего видения прихожей
Митч Демпси
0

Раньше я совмещал находку с grep как

находить . , | 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 дней.

r0berts
источник
0

Для выполнения поиска по «найденным» файлам есть такая конструкция:

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

Команда exec должна заканчиваться экранированным ";" и -H необходим для grep, чтобы распечатать путь к файлу в дополнение к строке в файле, где находится "строка".

Тед Баллу
источник