comando find no Linux para localizar arquivos pdf

11

Meu objetivo é encontrar todos os arquivos pdf em uma máquina remota, por isso recorro ao comando útil find. Então eu digito

find ~ * .pdf
ou
encontre ~ "* .pdf"
e não recebo nada. Faço o mesmo na minha máquina e não recebo nada. Faço uma pesquisa regular no menu da minha máquina e encontro alguns arquivos pdf. Alguém poderia me dizer o que estou fazendo de errado?

akira
fonte
11
Mantenha suas opiniões negativas fora da sua pergunta, se você deseja uma boa resposta. Em uma história relacionada, findestá longe de ser inútil.
Wilhelmtell 25/05
8
Claro que você tem o direito de liberdade de expressão. Mas você quer uma boa resposta, certo? Não, você não tem direito a uma boa resposta construtiva. Isso é um privilégio.
Wilhelmtell
2
Um trabalhador ruim sempre culpa suas ferramentas. Em outras palavras, PBCAK puro aqui.
Pascal Thivent
5
@Wilhelmtell, acho que a afirmação de Martin é justa - o comando nunca deveria ter sido chamado de "find" em primeiro lugar, mais como "walkpath_and_execute" ... ele não tem a interface mais intuitiva ou amigável e faz muito mais do que simplesmente encontrar arquivos. O nome simples "find" é enganoso, pois sugere uma interface simples que não possui. Claro, encontrar está longe de ser inútil e funciona muito bem, mas dificilmente se pode culpar um iniciante por não saber a diferença entre "encontrar", "localizar", "qual" etc.)
Michael Aaron Safyan
1
@ Michael Eu não culpo ninguém aqui; ou melhor, não fui eu quem culpou aqui. Eu nem disse que findé intuitivo. Eu provavelmente poderia dizer a mesma coisa em um tom mais agradável; às vezes reajo a comentários tolos (negativos).
Wilhelmtell 26/05

Respostas:

30

findestá longe de ser inútil. Você não está usando corretamente.

experimentar:

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

Mitch Dempsey
fonte
@ Martin - Feliz em ajudar, apenas certifique-se de marcar a pergunta como respondida!
Mitch Dempsey
@stepancheg Sim, por que você não desativa a Internet e imprime uma cópia impressa.
bobobobo
9

Dê uma olhada na documentação para os findutils . O findcomando é incrivelmente poderoso e, consequentemente, possui uma interface um tanto complicada. Você pode fazer o que quiser com:

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

O comando acima significa "localizar dentro. Para entradas do arquivo de tipo com um nome que não diferencia maiúsculas de minúsculas que corresponde a * .pdf (e imprime o nome de tais correspondências)". O comando find pode realmente ser usado para executar comandos nos arquivos encontrados (em vez de ou além de imprimir os nomes dos arquivos). Porém, para seus propósitos, você pode se sentir mais à vontade com o comando localizar , que - supondo que você construiu o banco de dados de localização usando o updatedb - facilita a localização de arquivos. Por exemplo:

locate '*.pdf'

Você também descobrirá que o comando find é geralmente mais rápido que o comando find, pois o find usa um índice de nomes de arquivos (o banco de dados de localização), enquanto o find percorre a hierarquia de cada chamada.

Michael Aaron Safyan
fonte
6

Você está simplesmente perdendo o predicado que diz o que está pesquisando (por exemplo -name).

Para localizar no diretório inicial por nome:

find ~ -name \*.pdf

Observe que o curinga *precisa ser escapado para que o shell não o interprete antes que o find coloque as mãos nele. Usar '*.pdf'e "*.pdf"terá o mesmo efeito que \*.pdf.

Para localizar sem distinção entre maiúsculas e minúsculas:

find ~ -iname \*.pdf

Para remover os resultados apenas em arquivos (a expressão do nome provavelmente cuidará disso para você, mas apenas no caso de você ter diretórios com nomes estranhos):

find ~ -type f -iname \*.pdf

Para garantir que encontre os links simbólicos a seguir (geralmente, eu mesmo quero fazer isso ao fazer pesquisas):

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

Para fazer algo com os arquivos que você encontrou: você pode despejar isso em um arquivo usando o redirecionamento stdout (por exemplo, aderir no > filenamefinal) ou usar a -execopção para executar um comando (consulte a página de manual para obter detalhes). Porém, este último executa um comando em cada arquivo por vez. geralmente é mais rápido permitir que o xargscomando passe seus arquivos encontrados como argumentos para outro comando, todos de uma vez ou grandes blocos de cada vez. Por exemplo, para grep ad-hoc (mas não indexado) nos arquivos de cabeçalho:

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

E uma extensão final, para que esse último comando funcione corretamente se você tiver arquivos e diretórios com espaços:

find ~ -follow -type f -name \*.h -print0 | xargs -0 grep -nH "identifier"
Owen S.
fonte
Na verdade, "* .pdf" seria expandido se houver arquivos no diretório atual que terminem com .pdf, certo? (nota menor)
Peter Jaric
1
Não na festança. No manual do bash: "Colocar caracteres entre aspas duplas preserva o valor literal de todos os caracteres entre aspas, com exceção de [dollar], [backquote], [pipe] e, quando a expansão do histórico está ativada, [bang]. " Tente você mesmo confirmar: ls "* .txt" em um diretório com arquivos de texto.
Owen S.
Sim, você está certo, é claro. Não sei de onde tirei essa ideia. Obrigado por me corrigir.
22812 Peter Pan-
3

dê uma olhada neste tutorial

eu acho que o que você quer fazer é

find . -name "*.pdf"

fonte
Você deve usar o inameatributo para uma melhor visão corredor
Mitch Dempsey
0

Eu costumava combinar o achado com o grep como

encontrar . . | grep -i ".pdf"

talvez não seja altamente eficiente, mas faz o trabalho bem.

Tiberiu Hajas
fonte
Isso poderia ser feito em finddiretamente se você desejou, via -iregex: find ~ -iregex '.*\.pdf'. O problema é que, no findpadrão, é tratado como se sempre houvesse um ^na frente e outro $na parte de trás; portanto, seu padrão precisa ser um pouco mais complicado. Observe também: que .no seu padrão é realmente um curinga de um caractere, não um período literal.
Owen S.
0

Encontre os arquivos que você precisa baixar nos últimos x dias

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

você encontrará arquivos pdf em seu ~diretório pessoal e abaixo, com extensão, .pdfindependentemente das letras maiúsculas e minúsculas (que são i in iname) e modificados até 1 dia atrás porque eu adicionei mtime -1; se você colocar -60 em mtime, serão os últimos 60 dias.

r0berts
fonte
0

Para executar uma pesquisa nos arquivos "encontrados", existe esta construção:

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

O comando exec deve terminar com o ";" escapado e o -H é necessário para o grep imprimir o caminho do arquivo, além da linha dentro do arquivo em que "string" está.

Ted Ballou
fonte