найти команду в 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 дней.


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.