Hur man hittar en fil från vilken katalog som helst

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:

  1. Filtillägget är okänt
  2. Det exakta namnet (dvs. stora bokstäver, siffror etc.) är okänt
  3. filens plats är okänd

Kommentarer

  • Om det finns en fil som heter 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 är Book1 och inte Book1.xyz?
  • Filens fullständiga namn är Book1. gnumeric. Säger du att jag måste ange hela filnamnet? Av någon anledning trodde jag, av det här specifika kommandot, att allt jag behöver ’ är det allmänna namnet på filen. Mitt test försöker hitta en fil om jag till exempel inte ’ inte kommer ihåg filändelsen och bara vet namnet på filen jag ’ jag letar efter. Vänligen meddela.
  • @don_crissti Klar. Se ovan Redigera.
  • Du blandar find och locate. 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 i ls. Du menar antagligen iname '*book1*'. Observera att mönstret måste vara inuti citat för att hindra skalet från att expandera det innan find får se det. Lägg också märke till att find, som många * nix-kommandon, är frustrerande tyst när det inte lyckas.

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

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *