Come trovare un file da qualsiasi directory

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 book1 ma non cè output.

Come faccio a trovare il mio file chiamato book1 utilizzando la riga di comando se non lo so dove si trova il file?

EDIT:

Il mio scenario è descritto più in dettaglio di seguito:

  1. Lestensione del file è sconosciuta
  2. Il nome esatto (cioè lettere maiuscole, numeri, ecc.) è sconosciuto
  3. Il la posizione del file è sconosciuta

Commenti

  • Se è presente un file chiamato Book1, ed è in una directory che puoi leggere, quindi find / -iname book1 lo troverà. Sei sicuro che sia effettivamente Book1 e non Book1.xyz?
  • Il nome completo del file è Book1. gnumeric. Stai dicendo che devo specificare lintero nome del file? Per qualche ragione ho pensato, per questo comando specifico, che tutto ciò di cui ho ‘ necessario fosse il nome generale del file. Il mio test sta cercando di trovare un file se, ad esempio, non ‘ ricordo lestensione del file e conosco solo il nome del file che ‘ sto cercando. Si prega di avvisare.
  • @don_crissti Fatto. Vedi sopra Modifica.
  • Stai mescolando find e locate. locate è generoso e troverà tutto ciò che corrisponde, purché si trovi nel suo database, che normalmente viene aggiornato quotidianamente. find, in questo caso, sta cercando un file glob, il tipo di pattern che useresti in ls. Probabilmente intendi iname '*book1*'. Nota che il pattern deve essere racchiuso tra virgolette per impedire alla shell di espandersi prima che find possa vederlo. Nota inoltre che find, come molti comandi * nix, è frustrantemente silenzioso quando non ha successo.

Rispondi

Innanzitutto, un argomento di -iname è un pattern della shell. Puoi leggere ulteriori informazioni sui pattern nel manuale di Bash . Il succo è che, affinché find trovi un file, il nome del file deve corrispondere al pattern specificato. Per creare una stringa senza distinzione tra maiuscole e minuscole book1 corrispondente Book1.gnumeric devi aggiungere * in modo ha questo aspetto:

find / -iname "book1*" 

o specifica il nome completo:

find / -iname "Book1.gnumeric" 

Secondo , -iname farà in modo che find ignori le maiuscole / minuscole nel nome del file, quindi se specifichi -iname book1 potrebbe anche trova Book1, bOok1 ecc. Se “sei sicuro che il file che” stai cercando si chiama Book1.gnumeric quindi non utilizzare -iname ma -name sarà più veloce:

find / -name "Book1.gnumeric" 

Terzo, ricorda di citare il modello come detto nella altra risposta .

E infine sei sicuro di voler cercare il file ovunque sul tuo sistema? È possibile che il file che stai cercando sia effettivamente nel tuo $HOME directory se ci hai lavorato o lo hai scaricato da qualche parte. Anche in questo caso, potrebbe essere molto più veloce.

EDIT :

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

find / -iname "book1*" 

Suggerisco anche di inserire 2>/dev/null alla fine della riga per nascondere tutti gli *permission denied* e altri errori che saranno presenti se invochi find come un utente non root:

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

E se “sei sicuro” di cercare un singolo file, e nel tuo sistema che corrisponde ai criteri puoi dire a find di uscire dopo aver trovato il primo file corrispondente:

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

Commenti

Risposta

Puoi provare il comando locate. Utilizza un database di nomi di file per rendere la ricerca più veloce.

Per cercare tutti i file corrispondenti a *book1* e ignorare le maiuscole / minuscole, puoi utilizzare

locate -i book1 

se desideri cercare file che iniziano con book1 dovrai inserire tu stesso il carattere jolly:

locate -i "book1*" 

È molto più veloce di find, ma è aggiornato solo quanto lultima volta che il database è stato aggiornato.

Commenti

  • Nessuno di questi ha prodotto alcun output per me: locate -i after.sh, sudo locate -i "after.sh", sudo locate -i after.sh, sudo locate -i '*after.sh'

Risposta

Se sai di avere un file chiamato book1.something, dove si trova la posizione del file, il valore esatto di something e il modello di maiuscolo del nome del file sono tutti sconosciuti:

find / -iname "book1.*" 

Se tutto quello che sai per certo è che il nome del file contiene la parola , puoi generare un elenco molto più grande con

find / -iname "*book*" 

Largomento di -name è un modello glob di 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. Lopzione -iname consente semplicemente una versione senza distinzione tra maiuscole e minuscole di questo.

Risposta

POSIXly,

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

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

Rispondi

Con Zsh puoi usare schemi glob, quindi funziona anche questo:

ls -a /**/book1 

Questo trova tutte le posizioni in cui risiede un file chiamato book1.

Nei miei test, sembra essere più veloce rispetto allutilizzo di find e produce anche pochi o nessun errore di autorizzazione dellutente se eseguito senza autorizzazione di root

Vedi manual .

Risposta

Per questo tipo di attività faccio sempre: find / -iregex ".*Book1.*"

Questo modulo si occuperebbe dei 3 punti del tuo scenario (iregex è unespressione razionale senza distinzione tra maiuscole e minuscole e il modello con .* su entrambi i lati corrisponderebbe a qualsiasi carattere prima e dopo il tuo schema fisso di Book1 – questo potrebbe ovviamente restituirti più risultati del necessario, ma sei sicuro di non perdere il file)

La differenza principale: se possibile, sii più restrittivo rispetto al semplice utilizzo di /, come provare solo /home o giù di lì, altrimenti scenderai in alcune directory non rilevanti (/sys, /dev, ecc …)

Ricorda comunque che Unix permissi si applicano: se il file si trova in una directory per la quale lutente che esegue il comando find non ha diritto di accesso (esecuzione), find lo farà non essere in grado di trovarlo lì.

Commenti

  • iregex ha vinto ‘ t funziona in posti come Solaris (il sistema operativo non è stato specificato) (e forse * BSD), è unestensione GNU e non fa parte dello standard find

Risposta

Silver Searcher è unutility molto veloce e pratica per cercare file e contenuti.

Per risolvere il tuo problema il comando silver searcher sarebbe simile a questo …

ag -g Book1

-g PATTERN Stampa nomi di file corrispondenti a PATTERN

Risposta

locate e le sue varianti tendono a 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 è avai lable, puoi utilizzare find. 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 find cerca cose su altre partizioni, come /proc e /sys, che tendono a inondare lo schermo di errori, soprattutto se non sei root.(Gli errori possono essere nascosti aggiungendo 2> /dev/null alla fine del comando find (il commento dovrebbe essere rimosso))

Se hai più partizioni e non ” Per sapere su quale si trova il file, puoi ottenere un elenco con lsblk (sui sistemi operativi basati su Linux, lanalisi delloutput di df è unopzione altrimenti) e inseriscilo in find: (root di nuovo se non sai 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 qualsiasi dei tuoi punti di montaggio contiene spazi) (df parametri potrebbe richiedere una regolazione. -P fa in modo che GNU df fornisca un output POSIX standard. Altro le versioni potrebbero avere altri parametri o doverli omettere. Leggi la tua pagina man)

grep -F esclude altre cose restituite, come le partizioni di swap.

Nella versione non GNU, awk trova i dispositivi con un montaggio che inizia con /dev per ottenere i file system reali e poi stampa lultimo file d (il punto di montaggio) dalloutput df.

Anche questo presuppone una shell simile a bourne (ksh e bash dovrebbe funzionare. Se utilizzi una csh variante, avvia una shell con script prima di provare)

Commenti

  • I grep potrebbero essere un po rumorosi, imparare a filtrarlo meglio (questo non dovrebbe essere necessario con lesempio, ma se si cerca qualcosa di più comune, il greps avrebbe bisogno di una regolazione per mantenere bassi i livelli di rumore)

Risposta

ag (il ricercatore dargento) fornisce una ricerca molto veloce nei file e ha anche unopzione 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 duso qui è 30 volte più veloce se il file non è un file ignorato da ag.

Answer

find / -type f -iname "book[0-9].*" 

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *