Sådan finder du en fil fra et hvilket som helst bibliotek

Jeg prøver at lede efter en fil, der hedder Book1 .

I min test prøver jeg at lede efter den førnævnte fil, og i denne test ved jeg ikke, hvor filen er placeret.

Jeg prøvede find / -iname book1 men der er ingen output.

Hvordan finder jeg min fil kaldet book1 ved hjælp af kommandolinjen, hvis jeg ikke ved det hvor filen er placeret?

EDIT:

Mit scenario er beskrevet mere detaljeret nedenfor:

  1. Filudvidelsen er ukendt
  2. Det nøjagtige navn (dvs. store bogstaver, tal osv.) er ukendt
  3. Filens placering er ukendt

Kommentarer

  • Hvis der er en fil, der hedder Book1, og det er i et bibliotek, du kan læse, så finder find / -iname book1 det. Er du sikker på, at det faktisk er Book1, og ikke Book1.xyz?
  • Filens komplette navn er Book1. gnumerisk. Siger du, at jeg skal angive hele filnavnet? Af en eller anden grund troede jeg, af denne specifikke kommando, at alt hvad jeg ‘ d har brug for er det generelle navn på filen. Min test forsøger at finde en fil, hvis jeg for eksempel ikke ‘ ikke kan huske filtypenavnet og kun kender navnet på den fil, jeg ‘ Jeg leder efter. Giv råd.
  • @don_crissti Udført. Se ovenfor Rediger.
  • Du blander find og locate. locate er generøs og finder noget, der matcher, så længe det er i sin database, som normalt opdateres dagligt. find, i dette tilfælde, er på udkig efter en filglob, den slags mønster, du vil bruge i ls. Du mener sandsynligvis iname '*book1*'. Bemærk, at mønsteret skal være inden for anførselstegn for at forhindre, at skallen udvider det, før find får se det. Bemærk også, at find, ligesom mange * nix-kommandoer, er frustrerende stille, når det ikke lykkes.

Svar

For det første er et argument til -iname et shell mønster . Du kan læse mere om mønstre i Bash manual . Kernen er, at for at find rent faktisk finder en fil, skal filnavnet matche det angivne mønster. For at få en store og små bogstaver book1 til at matche Book1.gnumeric skal du enten tilføje * det ser sådan ud:

find / -iname "book1*" 

eller angiv det fulde navn:

find / -iname "Book1.gnumeric" 

Andet , -iname vil få find til at ignorere filnavnet, så hvis du angiver -iname book1 kan det også find Book1, bOok1 osv. Hvis du “er sikker på, at den fil, du leder efter, hedder Book1.gnumeric så brug ikke -iname men -name, det bliver hurtigere:

find / -name "Book1.gnumeric" 

For det tredje skal du huske at citere mønsteret som sagt i andet svar .

Og sidst – er er du sikker på, at du vil lede efter filen overalt på dit system? Det er muligt, at den fil, du leder efter, faktisk findes i din $HOME bibliotek, hvis du har arbejdet med det eller downloadet det et eller andet sted. Igen kan det være meget hurtigere.

EDIT :

Jeg bemærkede at du redigerede dit spørgsmål. Hvis du ikke kender det fulde filnavn, store bogstaver og placering, skal du faktisk bruge noget som dette:

find / -iname "book1*" 

Jeg foreslår også at lægge 2>/dev/null i slutningen af linjen for at skjule alle *permission denied* og andre fejl, der vil være til stede, hvis du påberåber find som en ikke-root-bruger:

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

Og hvis du “er sikker på, at du leder efter en enkelt fil, og der kun er en enkelt fil på din system, der matcher kriterierne, du kan fortælle find at afslutte efter at have fundet den første matchende fil:

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

Kommentarer

Svar

Du kan prøve kommandoen locate. Den bruger en database med filnavne for at gøre søgning hurtigere.

For at søge efter alle filer, der matcher *book1*, og ignorere store og små bogstaver, kan du bruge

locate -i book1 

hvis du vil søge efter filer startende med book1 skal du selv udføre jokertegnet:

locate -i "book1*" 

Det er meget hurtigere end find, men er kun så opdateret som sidste gang databasen blev opdateret.

Kommentarer

  • Ingen af disse producerede noget output for mig: locate -i after.sh, sudo locate -i "after.sh", sudo locate -i after.sh, sudo locate -i '*after.sh'

Svar

Hvis du ved, at du har en fil, der hedder book1.something, hvor filplaceringen, den nøjagtige værdi af something , og store og små bogstaver i filnavnet er ukendte:

find / -iname "book1.*" 

Hvis alt hvad du ved med sikkerhed er, at filnavnet indeholder ordet , du kan generere en sandsynligvis meget større liste med

find / -iname "*book*" 

Argumentet for -name er et shell glob-mønster. Fra mappen, filen er i, skal du sammenligne:

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

Dette repræsenterer den type søgning, der udføres af -name. Indstillingen -iname tillader simpelthen en skiftesensitiv version af dette.

Svar

POSIXly,

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

Rapporterer stien til alle filer, hvis navn indeholder book1 (med enhver variation af sager , men kun i betragtning af ASCII latinske tegn bokBOK, ikke de mange andre variationer i Unicode som 𝗄, 𝚔, 𝘬, , , , og alle deres variationer med diakritik …) i alle de mapper, du har læst adgang til.

Svar

Med Zsh kan du bruge glob-mønstre, så det fungerer også:

ls -a /**/book1 

Dette vil find alle placeringer, hvor en fil kaldet book1 bor.

I min test ser det ud til at være hurtigere end at bruge find, og det producerer også lidt til ingen brugertilladelsesfejl når det køres uden rodtilladelse

Se manual .

Svar

For denne type opgaver gør jeg altid: find / -iregex ".*Book1.*"

Denne formular tager sig af de 3 punkter i dit scenario (iregex er et stort og ufølsomt rationelt udtryk, og mønsteret med .* på begge sider matcher ethvert tegn før og efter dit faste mønster af Book1 – dette kan naturligvis give dig flere resultater tilbage end nødvendigt, men du er sikker på ikke at gå glip af filen)

Hovedforskellen: hvis det er muligt, vær mere restriktiv end bare at bruge /, som kun at prøve /home eller så, ellers du kommer ned i nogle mapper, der ikke er relevante (/sys, /dev osv …)

Husk dog, at Unix tilladelse ons gælder: hvis filen er i et bibliotek, som brugeren, der kører find -kommandoen, ikke har adgang (udfører) til højre, vil find ikke være i stand til at finde det der.

Kommentarer

  • iregex vandt ‘ t arbejde på steder som Solaris (OS var ikke specificeret) (og muligvis * BSD), det er en GNU-udvidelse og er ikke en del af standard find

Svar

Silver Searcher er en meget hurtig og praktisk funktion til at søge efter filer og indhold.

For at løse dit problem ville sølv-søgekommandoen se sådan ud …

ag -g Book1

-g PATTERN Udskriv filnavne der matcher MØNSTER

Svar

locate og dens varianter har tendens til at være en hurtig 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 finder er ikke tilgængelig etiket, kan du bruge find i stedet. Det har en tendens til at være meget langsommere, men også meget mere præcist.

Hvis du har en enkelt partition: (kør som root, hvis din bruger muligvis ikke har adgang 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øger ting på andre partitioner, som /proc og /sys, som har en tendens til at oversvømme din skærm med fejl, især hvis du ikke er rod.(Fejl kan skjules ved at tilføje 2> /dev/null i slutningen af findkommandoen (kommentaren skal fjernes))

Hvis du har flere partitioner, og du ikke har ” Hvis du ikke ved, hvilken fil filen er på, kan du få en liste med lsblk (på Linux-baserede operativsystemer, parsing df output er en anden mulighed) og fodre det til find: (rod igen hvis du ikke ved, om du kan få adgang 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 lidt skrøbelig, hvis nogen af dine monteringspunkter har mellemrum i) (df -parametre skal muligvis justeres. -P gør GNU df til at give standard POSIX-output. Andet versioner kan have andre parametre eller har brug for det udeladt. Læs din mandeside)

grep -F ekskluderer andre returnerede ting, som f.eks. skiftepartitioner.

I den ikke-GNU-version finder awk enheder med et beslag, der starter med /dev for at få rigtige filsystemer og derefter udskrive det sidste felt d (monteringspunktet) fra df output.

Dette forudsætter også en bourne-lignende shell (ksh og bash skal fungere. Hvis du bruger en csh -variant, skal du starte en scriptbar shell , før du prøver dette)

Kommentarer

  • grep s kan være lidt støjende, lære at filtrere det bedre (dette skulle ikke være nødvendigt med eksemplet, men hvis det er noget mere almindeligt, der søges efter, greps har brug for indstilling for at holde støjniveauer nede)

Svar

ag (sølvsøgeren) giver meget hurtig søgning i filer og har også mulighed for at søge efter 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 min brugstilfælde her er det 30 gange hurtigere, hvis filen ikke er en fil ignoreret af ag.

Svar

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

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *