Jeg prøver å se etter en fil som heter Book1 .
I testen prøver jeg å lete etter den ovennevnte filen, og i denne testen vet jeg ikke hvor filen ligger.
Jeg prøvde find / -iname book1
men det er ingen utdata.
Hvordan finner jeg filen min som heter book1 ved hjelp av kommandolinjen hvis jeg ikke vet hvor filen ligger?
EDIT:
Scenarioet mitt er beskrevet nærmere nedenfor:
- Filutvidelsen er ukjent
- Det eksakte navnet (dvs. store bokstaver, tall osv.) er ukjent
- Filens plassering er ukjent
Kommentarer
Svar
For det første er et argument til -iname
et skall mønster . Du kan lese mer om mønstre i Bash manual . Kjernen er at for at find
faktisk skal finne en fil, må filnavnet matche det angitte mønsteret. For å lage en skiftløs-følsom streng book1
samsvarer med Book1.gnumeric
må du enten legge til *
det ser slik ut:
find / -iname "book1*"
eller spesifiser det fulle navnet:
find / -iname "Book1.gnumeric"
Second , -iname
vil få find
til å ignorere filnavnet, så hvis du angir -iname book1
kan det også finn Book1
, bOok1
osv. Hvis du «er sikker på at filen du leter etter heter Book1.gnumeric
så ikke bruk -iname
men -name
, det blir raskere:
find / -name "Book1.gnumeric"
For det tredje, husk å sitere mønsteret som sagt i annet svar .
Og sist – er er du sikker på at du vil se etter filen overalt på systemet ditt? Det er mulig at filen du leter etter, faktisk er i $HOME
katalog hvis du jobbet med det eller lastet det ned et sted. Igjen, det kan være mye raskere.
EDIT :
Jeg la merke til at du redigerte spørsmålet ditt. Hvis du ikke vet hele filnavnet, store bokstaver og plassering, bør du bruke noe sånt som dette:
find / -iname "book1*"
Jeg foreslår også at du legger til 2>/dev/null
på slutten av linjen for å skjule alle *permission denied*
og andre feil som vil være til stede hvis du påkaller find
som en ikke-rotbruker:
find / -iname "book1*" 2>/dev/null
Og hvis du «er sikker på at du leter etter en enkelt fil, og det bare er en enkelt fil på system som samsvarer med kriteriene du kan fortelle find
å avslutte etter å ha funnet den første samsvarende filen:
find / -iname "book1*" -print -quit 2>/dev/null
Kommentarer
Svar
Du kan prøve kommandoen locate
. Den bruker en database med filnavn for å gjøre søket raskere.
For å søke etter alle filene som samsvarer med *book1*
, og ignorere store og små bokstaver, kan du bruke
locate -i book1
Hvis du vil søke etter filer som starter med book1
, må du gjøre jokertegnet selv:
locate -i "book1*"
Det er mye raskere enn find
, men er bare så oppdatert som sist databasen ble oppdatert.
Kommentarer
- Ingen av disse ga noen utdata for meg:
locate -i after.sh
,sudo locate -i "after.sh"
,sudo locate -i after.sh
,sudo locate -i '*after.sh'
Svar
Hvis du vet at du har en fil som heter book1.something
, der filplasseringen, den nøyaktige verdien av something
, og store og små bokstaver for filnavnet er ukjente:
find / -iname "book1.*"
Hvis alt du vet med sikkerhet er at filnavnet inneholder ordet , du kan generere en sannsynlig mye større liste med
find / -iname "*book*"
Argumentet for -name
er et skall globmønster. Fra katalogen filen er i, sammenlign:
$ ls Book1 ls: cannot access "Book1": No such file or directory $ ls Book1.* Book1.gnumeric
Dette representerer typen søk utført av -name
. -iname
-alternativet tillater ganske enkelt en versjonsavhengig versjon av dette.
Svar
POSIXly,
LC_ALL=C find / -name "*[bB][oO][oO][kK]1*"
Vil rapportere banen til alle filer hvis navn inneholder book1
(med en hvilken som helst variant av sak , men bare med tanke på ASCII latinske tegn bokBOK
, ikke de mange andre variantene i Unicode som 𝗄
, 𝚔
, 𝘬
, ᵏ
, ₖ
, K
, k
og alle deres variasjoner med diakritikk …) i alle katalogene du har lest tilgang til.
Svar
Med Zsh kan du bruke globmønstre, så dette fungerer også:
ls -a /**/book1
Dette vil finn alle stedene der en fil som heter book1
bor.
I testingen min ser det ut til å være raskere enn å bruke find
, og det gir også lite til ingen brukertillatelsesfeil når det kjøres uten rottillatelse
Se manual .
Svar
For denne typen oppgaver gjør jeg alltid: find / -iregex ".*Book1.*"
Dette skjemaet vil ta seg av de tre punktene i scenariet ditt (iregex
er et saksfølsomt rasjonelt uttrykk, og mønsteret med .*
på begge sider vil matche hvilket som helst tegn før og etter det faste mønsteret av Book1 – dette kan åpenbart gi deg flere resultater enn nødvendig, men du er sikker på at du ikke vil savne filen) p>
Hovedforskjellen: vær om mulig mer restriktiv enn å bare bruke /
, som å bare prøve /home
eller så, ellers du kommer ned i noen kataloger som ikke er relevante (/sys
, /dev
osv …)
Husk imidlertid at Unix permissi ons gjelder: hvis filen er i en katalog som brukeren som kjører find
-kommandoen, ikke har tilgang (utfører) til høyre, vil find
ikke kan finne den der.
Kommentarer
- iregex vant ‘ t fungerer på steder som Solaris (OS ble ikke spesifisert) (og muligens * BSD), det er en GNU-utvidelse og er ikke en del av standard
find
Svar
Silver Searcher er et veldig raskt og praktisk verktøy for å søke etter filer og innhold.
For å løse problemet ditt, vil silver searcher-kommandoen se slik ut …
ag -g Book1
-g PATTERN
Skriv ut filnavn som samsvarer med MØNSTER
Svar
locate
og dens varianter har en tendens til å være en rask metode.
# 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
Hvis du finner er ikke avai etikett, kan du bruke find
i stedet. Det pleier å være mye tregere, men også mye mer presist.
Hvis du har en enkelt partisjon: (kjør som root hvis brukeren kanskje ikke har tilgang til filen)
$ 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
Hvis du ikke inkluderer -xdev
find
søker ting på andre partisjoner, som /proc
og /sys
, som har en tendens til å oversvømme skjermen med feil, spesielt hvis du ikke er root.(Feil kan skjules ved å legge til 2> /dev/null
på slutten av finnkommandoen (kommentaren skal fjernes))
Hvis du har flere partisjoner og du ikke har » Hvis du ikke vet hvilken fil filen er på, kan du få en liste med lsblk
(på Linux-baserte operativsystemer, analyseres df
et alternativ ellers) og mate det til finn: (root igjen hvis du ikke vet om du har tilgang til filen)
$ 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.
(Dette er litt skjøre hvis noen av monteringspunktene dine har mellomrom i) (df
-parametere kan trenge innstilling. -P gjør at GNU df
gir standard POSIX-utgang. Annet versjoner kan ha andre parametere eller trenger det utelatt. Les mannssiden din.
grep -F
ekskluderer andre ting som returneres, som byttepartisjoner.
I ikke-GNU-versjonen, finner awk enheter med et feste som starter med /dev
for å få ekte filsystemer og deretter skrive ut den siste filen d (monteringspunktet) fra df
-utgangen.
Dette forutsetter også et borne-lignende skall (ksh
og bash
skal fungere. Hvis du bruker en csh
-variant, må du starte et skriptbart skall før du prøver dette)
Kommentarer
-
grep
s kan være litt støyende, lære å filtrere det bedre (dette burde ikke være nødvendig med eksemplet, men hvis det er noe mer vanlig som man ser etter, tar grepene trenger innstilling for å holde støynivåene nede)
Svar
ag (silver searcher) gir veldig raskt søk i filer, og har også et alternativ for å søke etter filnavn:
>: 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
Så i mitt brukstilfelle her er det 30 ganger raskere hvis filen ikke er en fil ignorert av ag.
Svar
find / -type f -iname "book[0-9].*"
Book1
, og det er i en katalog du kan lese, så finnerfind / -iname book1
den. Er du sikker på at det faktisk erBook1
, og ikkeBook1.xyz
?find
oglocate
.locate
er sjenerøs, og finner alt som samsvarer, så lenge det er i databasen, som vanligvis oppdateres daglig.find
, i dette tilfellet, leter etter en filglob, det slags mønster du vil bruke ils
. Du mener sannsynligvisiname '*book1*'
. Merk at mønsteret må være inne i anførselstegn for å hindre at skallet utvides førfind
får se det. Legg også merke til atfind
, som mange * nix-kommandoer, er frustrerende lydløs når den ikke lykkes.