Jag försöker leta efter en fil som heter Book1 .
I mitt test försöker jag leta efter ovannämnda fil och i det här testet vet jag inte var filen ligger.
Jag försökte find / -iname book1
men det finns ingen utdata.
Hur hittar jag min fil som heter book1 med kommandoraden om jag inte vet var filen finns?
EDIT:
Mitt scenario beskrivs mer detaljerat nedan:
- Filtillägget är okänt
- Det exakta namnet (dvs. stora bokstäver, siffror etc.) är okänt
- filens plats är okänd
Kommentarer
Svar
För det första är ett argument till -iname
ett skal mönster . Du kan läsa mer om mönster i Bash-manual . Kärnan är att för att find
faktiskt ska hitta en fil måste filnamnet matcha det angivna mönstret. För att göra en skiftlägeskänslig sträng book1
matchar Book1.gnumeric
måste du antingen lägga till *
det ser ut så här:
find / -iname "book1*"
eller ange hela namnet:
find / -iname "Book1.gnumeric"
Andra , -iname
gör att find
ignorerar filnamnens fall så om du anger -iname book1
kan det också hitta Book1
, bOok1
etc. Om du är säker på att filen du letar efter heter Book1.gnumeric
använd inte -iname
men -name
, det blir snabbare:
find / -name "Book1.gnumeric"
För det tredje, kom ihåg att citera mönstret som sagt i annat svar .
Och sist – är är du säker på att du vill leta efter filen överallt på ditt system? Det är möjligt att filen du söker faktiskt finns i din $HOME
katalog om du arbetat med det eller laddat ner det från någonstans. Återigen kan det gå mycket snabbare.
EDIT :
Jag märkte att du redigerade din fråga. Om du inte känner till hela filnamnet, versalerna och platsen bör du verkligen använda något så här:
find / -iname "book1*"
Jag föreslår också att du lägger 2>/dev/null
i slutet av raden för att dölja alla *permission denied*
och andra fel som kommer att finnas om du åberopar find
en icke-root-användare:
find / -iname "book1*" 2>/dev/null
Och om du är säker på att du letar efter en enda fil och det bara finns en enda fil på din system som matchar kriterierna som du kan be find
att avsluta efter att du hittat den första matchande filen:
find / -iname "book1*" -print -quit 2>/dev/null
Kommentarer
Svar
Du kan prova kommandot locate
. Den använder en databas med filnamn för att göra sökningen snabbare.
Om du vill söka efter alla filer som matchar *book1*
och ignorera skiftläge kan du använda
locate -i book1
om du vill söka efter filer som börjar med book1
måste du göra jokertecknet själv:
locate -i "book1*"
Den är mycket snabbare än find
, men är bara så uppdaterad som senaste gången databasen uppdaterades.
Kommentarer
- Ingen av dessa gav någon utdata för mig:
locate -i after.sh
,sudo locate -i "after.sh"
,sudo locate -i after.sh
,sudo locate -i '*after.sh'
Svar
Om du vet att du har en fil som heter book1.something
, där filens plats, det exakta värdet av something
, och huvudnamnet för filnamnet är okänt:
find / -iname "book1.*"
Om allt du vet med säkerhet är att filnamnet innehåller ordet , du kan skapa en sannolikt mycket större lista med
find / -iname "*book*"
Argumentet för -name
är ett skal globmönster. Från katalogen filen finns i, jämför:
$ ls Book1 ls: cannot access "Book1": No such file or directory $ ls Book1.* Book1.gnumeric
Detta representerar den typ av sökning som utförs av -name
. Alternativet -iname
tillåter helt enkelt en skiftlägeskänslig version av detta.
Svar
POSIXly,
LC_ALL=C find / -name "*[bB][oO][oO][kK]1*"
Rapporterar sökvägen för alla filer vars namn innehåller book1
(med valfri variation , men bara med tanke på ASCII-latinska tecken bokBOK
, inte de många andra variationerna i Unicode som 𝗄
, 𝚔
, 𝘬
, ᵏ
, ₖ
, K
, k
och alla deras variationer med diakritik …) i alla kataloger som du har läsbehörighet till.
Svara
Med Zsh kan du använda globmönster, så det fungerar också:
ls -a /**/book1
Detta kommer att hitta alla platser där en fil som heter book1
bor.
I mina tester verkar det vara snabbare än att använda find
, och det ger också lite till inga användarbehörighetsfel när det körs utan rootbehörighet
Se manual .
Svar
För den här typen av uppgifter gör jag alltid: find / -iregex ".*Book1.*"
Det här formuläret tar hand om de tre punkterna i ditt scenario (iregex
är ett skiftlägeskänsligt rationellt uttryck och mönstret med .*
på båda sidor skulle matcha vilket tecken som helst före och efter ditt fasta mönster av Book1 – detta kan givetvis ge dig fler resultat än nödvändigt men du är säker på att du inte missar filen)
Huvudskillnaden: om möjligt, var mer restriktiv än att bara använda /
, som att bara försöka /home
eller så, annars du kommer att komma ner i vissa kataloger som inte är relevanta (/sys
, /dev
, osv …)
Kom ihåg att Unix permissi ons gäller: om filen finns i en katalog för vilken användaren som kör find
kommandot inte har någon åtkomst (exekverar) rätt, find
inte kunna hitta det där.
Kommentarer
- iregex vann ’ t fungerar på platser som Solaris (OS specificerades inte) (och möjligen * BSD), det är en GNU-förlängning och ingår inte i standard
find
Svar
Silver Searcher är ett mycket snabbt och praktiskt verktyg för att söka efter filer och innehåll.
För att lösa ditt problem skulle silver searcher-kommandot se ut så här …
ag -g Book1
-g PATTERN
Skriv ut filnamn som matchar PATTERN
Svar
locate
och dess varianter tenderar att vara en snabb metod.
# 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
Om du hittar är inte avai etikett kan du istället använda find
. Det brukar vara mycket långsammare men också mycket mer exakt.
Om du har en enda partition: (kör som root om din användare kanske inte har tillgång till 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
Om du inte inkluderar -xdev
find
söker saker på andra partitioner, som /proc
och /sys
, som tenderar att översvämma din skärm med fel, särskilt om du inte är root.(Fel kan döljas genom att lägga till 2> /dev/null
i slutet av sökkommandot (kommentaren ska tas bort))
Om du har flera partitioner och du inte har ” Om du inte vet vilken fil filen är på kan du få en lista med lsblk
(på Linux-baserade operativsystem, analyseras df
ett alternativ annars) och mata det till hitta: (root igen om du inte vet om du kan komma åt 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.
(Detta är lite ömtålig om någon av dina monteringspunkter har mellanslag i) (df
parametrar kan behöva justeras. -P gör att GNU df
ger standard POSIX-utdata. Annat versioner kan ha andra parametrar eller behöver den utelämnas. Läs din mansida)
grep -F
exkluderar andra returnerade saker, som swap-partitioner.
I den icke-GNU-versionen hittar awk enheter med ett fäste som börjar med /dev
för att få riktiga filsystem och sedan skriva ut den sista filen d (monteringspunkten) från df
-utgången.
Detta förutsätter också ett bornliknande skal (ksh
och bash
ska fungera. Om du använder en csh
-variant, starta ett skriptbart skal innan du försöker göra det)
Kommentarer
-
grep
s kan vara lite bullriga, lära sig att filtrera det bättre (detta borde inte behövas med exemplet, men om det är något mer vanligt som man letar efter, greps skulle behöva justeras för att hålla bullernivåerna nere)
Svar
ag (silversökaren) ger mycket snabb sökning i filer och har också ett alternativ att söka efter filnamn:
>: 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 användningsfall här är det 30 gånger snabbare om filen inte är en fil som ignoreras av ag.
Svar
find / -type f -iname "book[0-9].*"
Book1
, och det finns i en katalog som du kan läsa, dåfind / -iname book1
hittar den. Är du säker på att det faktiskt ärBook1
och inteBook1.xyz
?find
ochlocate
.locate
är generös och hittar allt som matchar, så länge det finns i sin databas, som normalt uppdateras dagligen.find
, i det här fallet, letar efter en filglob, den typ av mönster du skulle använda ils
. Du menar antagligeniname '*book1*'
. Observera att mönstret måste vara inuti citat för att hindra skalet från att expandera det innanfind
får se det. Lägg också märke till attfind
, som många * nix-kommandon, är frustrerande tyst när det inte lyckas.