Come trovare un file da qualsiasi directory


22

Sto cercando di cercare un file chiamato Book1 .

Nel mio test sto cercando di cercare il file di cui sopra e in questo test, non so dove si trova quel file.

Ho provato find / -iname book1ma non c'è output.

Come trovo il mio file chiamato book1 usando la riga di comando se non so dove si trova il file?

MODIFICARE:

Il mio scenario è descritto più dettagliatamente di seguito:

  1. L'estensione del file è sconosciuta
  2. Il nome esatto (ovvero lettere maiuscole, numeri, ecc.) È sconosciuto
  3. La posizione del file è sconosciuta

2
Se c'è un file chiamato Book1, ed è in una directory che puoi leggere, allora find / -iname book1lo troverà. Sei sicuro che lo sia davvero Book1e no Book1.xyz?
Fox,

Il nome completo del file è Book1.gnumeric. Stai dicendo che devo specificare l'intero nome del file? Per qualche ragione ho pensato, per questo comando specifico, che tutto ciò di cui avrei bisogno è il nome generale del file. Il mio test sta cercando di trovare un file se, ad esempio, non ricordo l'estensione del file e conosco solo il nome del file che sto cercando. Si prega di avvisare.
Aspire27

@don_crissti Fatto. Vedi sopra Modifica.
Aspire27

Stai mescolando find e locate. locateè generoso e troverà tutto ciò che corrisponde, purché sia ​​nel suo database, che viene normalmente aggiornato quotidianamente. find, in questo caso, è alla ricerca di un file glob, il tipo di pattern in cui useresti ls. Probabilmente intendi iname '*book1*'. Si noti che il modello deve essere racchiuso tra virgolette per impedire alla shell di espanderlo prima finddi vederlo. Si noti inoltre che find, come molti comandi * nix, è frustrantemente silenzioso quando non ha esito positivo.
Manngo,

Risposte:


31

Innanzitutto, un argomento su -inameè un modello di shell . Puoi leggere di più sugli schemi nel manuale di Bash . L'essenza è che per trovarefind effettivamente un file il nome file deve corrispondere al modello specificato. Per far corrispondere una stringa senza distinzione tra maiuscole e minuscole , devi aggiungerla in questo modo:book1Book1.gnumeric*

find / -iname 'book1*'

o specifica il nome completo:

find / -iname 'Book1.gnumeric'

In secondo luogo, -inamerenderà findignorare il caso il nome del file, quindi se si specifica -iname book1che potrebbe anche trovare Book1, bOok1ecc Se sei sicuro il file che state cercando si chiama Book1.gnumeric allora non usare -iname, ma -name, sarà più veloce:

find / -name 'Book1.gnumeric'

Terzo, ricordati di citare lo schema come detto nell'altra risposta .

E infine: sei sicuro di voler cercare il file ovunque sul tuo sistema? È possibile che il file che stai cercando sia effettivamente nella tua $HOMEdirectory se ci hai lavorato o scaricato da qualche parte. Ancora una volta, potrebbe essere molto più veloce.

MODIFICA :

Ho notato che hai modificato la tua domanda. Se non conosci il nome completo, le maiuscole e la posizione, dovresti usare qualcosa del genere:

find / -iname 'book1*'

Suggerisco anche di mettere 2>/dev/nullalla fine della riga per nascondere tutti gli *permission denied*altri errori che saranno presenti se invochi findcome utente non root:

find / -iname 'book1*' 2>/dev/null

E se sei sicuro di cercare un singolo file e sul tuo sistema esiste un solo file che soddisfa i criteri che puoi dire finddi uscire dopo aver trovato il primo file corrispondente:

find / -iname 'book1*' -print -quit 2>/dev/null


6

Puoi provare il locatecomando. Utilizza un database di nomi di file per velocizzare la ricerca.

Per cercare tutti i file corrispondenti *book1*e ignorare il caso, è possibile utilizzare

locate -i book1

se si desidera cercare i file che iniziano con book1è necessario eseguire il carattere jolly da soli:

locate -i 'book1*'

È molto più veloce di find, ma è aggiornato solo l'ultima volta che il database è stato aggiornato.


5

Se sai di avere un file chiamato book1.something, in cui la posizione del file, il valore esatto di somethinge il modello di maiuscole del nome file sono tutti sconosciuti:

find / -iname 'book1.*'

Se tutto ciò che sai per certo è che il nome file contiene la parola book, puoi generare un elenco probabilmente molto più grande con

find / -iname '*book*'

L'argomento -nameè un modello glob shell. Dalla directory in cui si trova il file, confronta:

$ ls Book1
ls: cannot access 'Book1': No such file or directory
$ ls Book1.*
Book1.gnumeric

Questo rappresenta il tipo di ricerca eseguita da -name. L' -inameopzione consente semplicemente una versione senza distinzione tra maiuscole e minuscole.


1

POSIXly,

LC_ALL=C find / -name '*[bB][oO][oO][kK]1*'

Segnalerà il percorso di tutti i file il cui nome contiene book1(con qualsiasi variazione di caso, ma solo considerando i caratteri latini ASCII bokBOK, non le molte altre varianti in Unicode come 𝗄, 𝚔, 𝘬, , , , e tutte le loro variazioni con segni diacritici ...) in tutte le directory a cui hai accesso in lettura.


0

Per questo tipo di compiti faccio sempre: find / -iregex '.*Book1.*'

Questo modulo si occuperebbe dei 3 punti del tuo scenario ( iregexè un'espressione razionale insensibile al maiuscolo / minuscolo, e il modello con .*su entrambi i lati corrisponderebbe a qualsiasi carattere prima e dopo il tuo modello fisso di Book1 - questo potrebbe ovviamente darti più risultati del necessario ma sei sicuro di non perdere il file)

La differenza principale: se possibile, essere più restrittiva rispetto usando solo /, come cercare solo /homeo giù di lì, altrimenti si scende in alcune directory che non sono rilevanti ( /sys, /dev, ecc ...)

Ricorda tuttavia che si applicano le autorizzazioni Unix: se il file si trova in una directory per la quale l'utente che esegue il findcomando non ha diritto di accesso (esecuzione), findnon sarà in grado di trovarlo lì.


iregex non funzionerà in luoghi come Solaris (il sistema operativo non è stato specificato) (e forse * BSD), è un'estensione GNU e non fa parte dello standardfind
Gert van den Berg

0

Silver Searcher è un programma di utilità molto veloce e pratico per cercare file e contenuti.

Per risolvere il tuo problema, il comando Silver Searcher sarebbe simile a questo ...

ag -g Book1

-g PATTERN Stampa i nomi dei file corrispondenti a PATTERN


0

locate e le sue varianti tendono ad essere un metodo veloce.

# updatedb # run as root, possibly using sudo, e.g. sudo -b updatedb. If file is on the system for more than a day it should already be in the index and this can be skipped
$ locate -i book1

Se individuare non è disponibile, è possibile utilizzare findinvece. Tende ad essere molto più lento, ma anche molto più preciso.

Se hai una singola partizione: (esegui come root se il tuo utente potrebbe non avere accesso al file)

$ find / -xdev -iname 'book1*' -print # If the iname extension to find is available
$ find / -xdev -print | grep -F -i /book1 # if iname is not available

Se non includi -xdev findricerche su cose su altre partizioni, come /proce /sys, che tendono a inondare lo schermo di errori, specialmente se non sei root. (Gli errori possono essere nascosti aggiungendo 2> /dev/nullalla fine del comando find (il commento deve essere rimosso))

Se si dispone di più partizioni e non si conosce su quale file si trova, è possibile ottenere un elenco con lsblk(su sistemi operativi basati su Linux, l'analisi dfdell'output è un'opzione altrimenti) e inserirla in find: (eseguire nuovamente il root se si non so se puoi accedere al file)

$ find $(lsblk -O MOUNTPOINT -n | grep -F /) -xdev -iname 'book1*' -print # GNU-based OSes
$ find $(df -P|awk '$1 ~ /^\/dev/ {print $NF}') -xdev | grep -F -i book1 # Non-GNU based OSes.

(Questo è un po 'fragile se uno dei tuoi mountpoint ha degli spazi) (i dfparametri potrebbero aver bisogno di essere sintonizzati. -P fa in modo che GNU dffornisca un output POSIX standard. Altre versioni potrebbero avere altri parametri o necessitarsene esclusi. Leggi la tua pagina man)

Le grep -Fesclude altre cose tornarono, come le partizioni di swap.

Nella versione non GNU, awk trova i dispositivi con un mount che inizia /devper ottenere file system reali e quindi stampa l'ultimo campo (il mountpoint) dfdall'output.

Questo presuppone anche una shell simile a bourne ( kshe bashdovrebbe funzionare. Se si utilizza una cshvariante, avviare una shell gestibile prima di provare questo)


Gli greps potrebbero essere un po 'rumorosi, imparare a filtrarlo meglio (questo non dovrebbe essere necessario con l'esempio, ma se si cerca qualcosa di più comune, i greps dovrebbero essere ottimizzati per mantenere bassi i livelli di rumore)
Gert van den Berg,

0

ag (il cercatore d'argento) fornisce una ricerca molto veloce nei file e ha anche un'opzione per cercare il nome del file:

>: time ag -g foo # uses heuristics to only look in desired locations
apps/vxy/src/assets/tree-content-pages/tree-page-bird/foo-illustration.jpg

real    0m0.884s
user    0m0.701s
sys     0m0.178s

>: time find . -name "*foo*"
./apps/ssr/dist/static/media/foo-illustration.jpg
./apps/vxy/dist/static/media/foo-illustration.jpg
./apps/vxy/src/assets/tree-content-pages/tree-page-bird/foo-illustration.jpg

real    0m29.744s
user    0m2.108s
sys     0m13.982s

>: time ag -ug foo # searching all files is still faster and simpler to use then find command
apps/ssr/dist/static/media/foo-illustration.jpg
apps/vxy/dist/static/media/foo-illustration.jpg
apps/vxy/src/assets/tree-content-pages/tree-page-bird/foo-illustration.jpg

real    0m16.698s
user    0m1.951s
sys     0m7.119s

Quindi nel mio caso d'uso qui è> 30 volte più veloce se il file non è un file ignorato da ag.

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.