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:
- Filudvidelsen er ukendt
- Det nøjagtige navn (dvs. store bogstaver, tal osv.) er ukendt
- Filens placering er ukendt
Kommentarer
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 𝗄
, 𝚔
, 𝘬
, ᵏ
, ₖ
, K
, k
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].*"
Book1
, og det er i et bibliotek, du kan læse, så finderfind / -iname book1
det. Er du sikker på, at det faktisk erBook1
, og ikkeBook1.xyz
?find
oglocate
.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 ils
. Du mener sandsynligvisiname '*book1*'
. Bemærk, at mønsteret skal være inden for anførselstegn for at forhindre, at skallen udvider det, førfind
får se det. Bemærk også, atfind
, ligesom mange * nix-kommandoer, er frustrerende stille, når det ikke lykkes.