trova il comando in Linux per individuare i file pdf


10

Il mio obiettivo è trovare tutti i file pdf su una macchina remota, quindi ricorro al comando utile find. Quindi scrivo

find ~ *.pdf
o
find ~ "*.pdf"
e non ottengo niente Faccio lo stesso sulla mia macchina e non ottengo nulla. Faccio una ricerca regolare dal menu sulla mia macchina e trovo alcuni file pdf. Qualcuno potrebbe dirmi cosa sto sbagliando?

11
Mantieni le tue opinioni negative al di fuori della tua domanda se vuoi una buona risposta. In una storia correlata, find è tutt'altro che inutile.
wilhelmtell

8
Naturalmente hai il diritto di parlare liberamente. Ma tu vuoi una buona risposta, giusto? No, non hai un destra per una buona risposta costruttiva. Questo è un privilegio.
wilhelmtell

2
Un cattivo operaio incolpa sempre i suoi strumenti. In altre parole, puro PBCAK Qui.
Pascal Thivent

5
@Wilhelmtell, penso che l'affermazione di Martin sia corretta: il comando non dovrebbe mai essere chiamato "find" in primo luogo, più come "walkpath_and_execute" ... non ha l'interfaccia più intuitiva o user-friendly e fa molto di più di trovare semplicemente i file. Il semplice nome "trova" è ingannevole in quanto suggerisce un'interfaccia semplice che non ha. Certo, trovare è tutt'altro che inutile e funziona abbastanza bene, ma difficilmente si può incolpare un principiante per non conoscere la differenza tra "trova", "trova", "che", ecc.
Michael Aaron Safyan

1
@ Michael non ho dato la colpa a nessuno qui; o, piuttosto, non ero io a fare la colpa qui. Non ho nemmeno detto find è intuitivo. Potrei probabilmente dire la stessa cosa con un tono più bello però; a volte reagisco a commenti (sciocchi) negativi.
wilhelmtell

Risposte:


29

find è tutt'altro che inutile. Non stai semplicemente usando correttamente.

provare:

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


@ Martin - Felice di aiutare, assicurati di contrassegnare la domanda come risposta!
Mitch Dempsey

@stepancheg Sì, perché non prendere Internet e stampare una copia cartacea.
bobobobo

9

Dai un'occhiata alla documentazione per Findutils . Il find il comando è incredibilmente potente e, di conseguenza, ha un'interfaccia piuttosto complicata. Puoi fare quello che vuoi con:

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

Il comando precedente significa "trova dentro. Per le voci del file di tipo con un nome non sensibile alla distinzione tra maiuscole e minuscole * .pdf (e stampa il nome di tali corrispondenze)". Il comando find può essere effettivamente utilizzato per eseguire comandi sui file trovati (anziché o in aggiunta alla stampa dei nomi dei file). Per i tuoi scopi, però, potresti trovarti più a tuo agio con il individuare comando, che - assumendo che tu abbia creato il database locate usando updatedb - rende molto facile trovare i file. Per esempio:

locate '*.pdf'

Troverete anche che il comando locate è in genere più veloce del comando find poiché locate utilizza un indice di nomi di file (il database locate), mentre find percorrerà la gerarchia per ogni chiamata.


6

Ti manca semplicemente il predicato che dice ciò che stai cercando (ad es. -name.)

Per trovare nella directory home per nome:

find ~ -name \*.pdf

Si noti che il carattere jolly * deve essere scappato in modo che la shell non la interpreti prima che trovi le sue mani su di essa. utilizzando '*.pdf' e "*.pdf" avrà lo stesso effetto di \*.pdf.

Per trovare case-insensitively:

find ~ -iname \*.pdf

Per potare i risultati solo sui file (l'espressione del nome probabilmente si prenderà cura di questo per te, ma nel caso tu abbia delle directory con nomi strani):

find ~ -type f -iname \*.pdf

Per essere sicuro che la ricerca segua i collegamenti simbolici (di solito io stesso faccio questo quando faccio ricerche):

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

Per fare qualcosa con i file che hai trovato: puoi scaricarli in un file usando il reindirizzamento stdout (ad es. > filename alla fine), o usare il -exec opzione per eseguire un comando (vedere la pagina man per i dettagli). Quest'ultimo esegue un comando su ogni file alla volta, però. è spesso più veloce lasciare il xargs comando passare i file trovati come argomenti a un altro comando, tutto in una volta o grandi blocchi alla volta. Ad esempio, per greps ad-hoc (ma non indicizzati) tramite i file di intestazione:

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

E un'estensione finale, per fare in modo che quest'ultimo comando funzioni correttamente se hai file e amp; directory con spazi in loro:

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

In realtà, "* .pdf" si espanderebbe se ci sono file nella directory corrente che terminano con .pdf, giusto? (nota minore)
Peter Jaric

1
Non in bash. Dal manuale di bash: "Racchiudere i caratteri tra virgolette mantiene il valore letterale di tutti i caratteri all'interno delle virgolette, con l'eccezione di [dollaro], [backquote], [pipe] e, quando l'espansione della cronologia è abilitata, [bang]. " Prova tu stesso a confermare: ls "* .txt" su una directory con file di testo al suo interno.
Owen S.

Sì, hai ragione, ovviamente. Non so da dove ho preso l'idea. Grazie per avermi corretto.
Peter Jaric

3

guarda questo lezione

penso che quello che vuoi fare sia

find . -name "*.pdf"

Dovresti usare il iname attributo per una migliore visione del corridoio
Mitch Dempsey

0

Ho usato per combinare la ricerca con grep

trova . . | grep -i ".pdf"

forse non è efficiente, ma fa bene il lavoro.


Questo potrebbe essere fatto in find direttamente se lo desideri, via -iregex: find ~ -iregex '.*\.pdf'. Il problema è, in find il modello è trattato come se avesse sempre un ^ nella parte anteriore e a $ sul retro, quindi il tuo pattern deve essere un po 'più complicato. Nota anche: quello . nel tuo pattern è in realtà un carattere jolly a carattere singolo, non un periodo letterale.
Owen S.

0

Trova i file che devi scaricare negli ultimi x giorni

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

troverai i file pdf nella tua casa ~ directory e sotto con estensione .pdf indipendentemente dal maiuscolo e minuscolo (questo è in iname ) e modificato fino a 1 giorno fa perché ho aggiunto mtime -1; se metti -60 in mtime saranno gli ultimi 60 giorni.


0

Per eseguire una ricerca all'interno dei file "trovati" c'è questa costruzione:

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

Il comando exec deve terminare con l'escape ";" e il -H è necessario per grep per stampare il percorso del file oltre alla linea all'interno del file dove è "string".

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.