10

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

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

7 ответов7

29

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

пытаться:

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

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"
3

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

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

find . -name "*.pdf"
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, чтобы распечатать путь к файлу в дополнение к строке в файле, где находится "строка".

0

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

находить . , | grep -i ".pdf"

может быть, не очень эффективный, но он отлично справляется со своей работой.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .