Come posso cercare un file per nome e percorso parziale?


64

Spesso ho un nome file e il suo percorso parziale, ad es. "Content / docs / file.xml".

Esiste un modo semplice per cercare quel file, senza tagliare manualmente in parti il ​​suo nome per fornire separatamente il nome della directory e il nome del file?

Sarebbe bello se findfunzionasse in quel modo, quindi potrei correre find content/docs/file.xml, ma sfortunatamente no.


1
Potresti provare ad aggiungere un carattere jolly * all'inizio. find -path *content/docs/file.xmlha funzionato per me.
Bob

grazie, @Bob, ha funzionato davvero per me. A proposito, interessante, che se aggiungo una barra dopo un asterisco: "find -path * / content / docs / file.xml", non funziona. Grazie mille comunque.

inoltre, @Bob, ti preghiamo di farlo come una risposta e lo segnerò come corretto.

Il motivo per cui la barra dopo l'asterisco non ha funzionato è probabilmente perché l'asterisco avrebbe dovuto essere evaso, vedi la modifica alla mia risposta.
Bob

Risposte:


72

Passare un *carattere jolly per indicare una corrispondenza per qualsiasi cosa . È inoltre necessario sfuggire alla *s, ad esempio:

find . -path \*content/docs/file.xml

o racchiudi il motivo tra virgolette, ad esempio:

find . -path "*content/docs/file.xml"

Come la pagina man lo descrive:

$ find. -name * .c -print

trova: i percorsi devono precedere l'espressione

Ciò accade perché * .c è stato espanso dalla shell, risultando in find che riceve effettivamente una riga di comando come questa:

trova . -name bigram.c code.c frcode.c individuare.c -print

Ovviamente quel comando non funzionerà. Invece di fare le cose in questo modo, dovresti racchiudere il modello tra virgolette o sfuggire al jolly:

$ find. -name \ *. c -print


10

find ha anche un'opzione -wholename find $top_dir -wholename *string*

find /usr -wholename *in/abiw*

>/usr/bin/abiword

Non conosco il percorso completo, solo parziale, quindi "-wholename" non funzionerà.

la bandiera è fuorviante, vedi il mio esempio ... ti permette di estendere la stringa in una directory se lo conosci
technosaurus

3
find . -type f | grep "content/docs/file.xml"

o solo

locate content/docs/file.xml

individuare è un'opzione interessante, ma cerca in tutto il disco, mi piacerebbe avere la possibilità di specificare la directory di ricerca di base o almeno di specificare usando param, che la ricerca dovrebbe essere fatta da questa directory (come fa la tua prima opzione) , non dalla radice.

1
@ user69817 - al contrario, individuare non cerca il disco, interroga un database di individuazione, che in genere viene popolato tramite cron una volta al giorno.
tink

1

Ad esempio la ricerca di file in una posizione utilizzando asterisco / carattere jolly ( *) come: dir=“/apps/*/instance01/" è possibile utilizzare find ${dir} -name “*.jks”. mettendo tutti i file in un array come questo:

arr=(`find ${dir} -name “*.jks"`)

se vuoi ottenere file con altre estensioni usa 'o' in questo modo:

-name "*.keystore" -o -name "*.jks" -o -name “*.p12" perché -nameaccetta solo una singola stringa, quindi usa 'o'.

Finalmente metti tutto in array come questo:

arr=(`find ${dir} -name "*.keystore" -o -name "*.jks" -o -name "*.p12"`)

se si dispone di percorsi completi non di percorsi parziali è molto più semplice inserirli in array come questo:

arr=(“/Users/ajay/Documents/keystore_and_p12files/"*.{keystore,p12,jks})
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.