Hvordan finne en fil fra hvilken som helst katalog

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:

  1. Filutvidelsen er ukjent
  2. Det eksakte navnet (dvs. store bokstaver, tall osv.) er ukjent
  3. Filens plassering er ukjent

Kommentarer

  • Hvis det er en fil som heter Book1, og det er i en katalog du kan lese, så finner find / -iname book1 den. Er du sikker på at det faktisk er Book1, og ikke Book1.xyz?
  • Hele navnet på filen er Book1. gnumerisk. Sier du at jeg må spesifisere hele navnet på filen? Av en eller annen grunn trodde jeg, av denne spesifikke kommandoen, at alt jeg ‘ d trenger er det generelle navnet på filen. Testen min prøver å finne en fil hvis jeg for eksempel ikke ‘ ikke husker filtypen og bare vet navnet på filen jeg ‘ Jeg ser etter. Vennligst gi beskjed.
  • @don_crissti Ferdig. Se redigeringen ovenfor.
  • Du blander find og locate. 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 i ls. Du mener sannsynligvis iname '*book1*'. Merk at mønsteret må være inne i anførselstegn for å hindre at skallet utvides før find får se det. Legg også merke til at find, som mange * nix-kommandoer, er frustrerende lydløs når den ikke lykkes.

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 𝗄, 𝚔, 𝘬, , , , 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].*" 

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *