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:
- Lestensione del file è sconosciuta
- Il nome esatto (cioè lettere maiuscole, numeri, ecc.) è sconosciuto
- Il la posizione del file è sconosciuta
Commenti
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 𝗄
, 𝚔
, 𝘬
, ᵏ
, ₖ
, K
, k
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].*"
Book1
, ed è in una directory che puoi leggere, quindifind / -iname book1
lo troverà. Sei sicuro che sia effettivamenteBook1
e nonBook1.xyz
?find
elocate
.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 inls
. Probabilmente intendiiname '*book1*'
. Nota che il pattern deve essere racchiuso tra virgolette per impedire alla shell di espandersi prima chefind
possa vederlo. Nota inoltre chefind
, come molti comandi * nix, è frustrantemente silenzioso quando non ha successo.