Sådan bruger du Find og Locate til at søge efter filer på Linux

author
9 minutes, 11 seconds Read

Indledning

Et af de problemer, som brugere støder på, når de for første gang arbejder med en Linux-maskine, er, hvordan de finder de filer, de leder efter.

Denne vejledning beskriver, hvordan du bruger den velkendte find-kommando. Denne vil hjælpe dig med at søge efter filer på din VPS ved hjælp af en række filtre og parametre. Vi vil også kort dække kommandoen locate, som kan bruges til at søge efter filer på en anden måde.

Søgning efter navn

Den mest oplagte måde at søge efter filer på er efter navn.

For at finde en fil efter navn, skal du skrive:

  • find -name "query"

Dette vil være stempelfølsomt, hvilket betyder, at en søgning efter file er anderledes end en søgning efter File.

For at finde en fil efter navn, men ignorere kasus i forespørgslen, skal du skrive:

  • find -iname "query"

Hvis du vil finde alle filer, der ikke overholder et bestemt mønster, kan du invertere søgningen med -not eller !. Hvis du bruger !, skal du undslippe tegnet, så bash ikke forsøger at fortolke det, før find kan handle:

  • find -not -name "query_to_avoid"

Og

  • find \! -name "query_to_avoid"

Søgning efter type

Du kan angive den type filer, du vil finde, med parameteren -type. Det fungerer på denne måde:

  • find -type type_descriptor query

Nogle af de mest almindelige deskriptorer, som du kan bruge til at angive filtypen, er her:

  • f: almindelig fil

  • d: mappe

  • l: symbolsk link

  • c: tegn enheder

  • b: tegn enheder

  • b: blok-enheder

Hvis vi f.eks. ville finde alle tegn-enhederne på vores system, kunne vi sende denne kommando:

  • find / -type c
Output
/dev/parport0/dev/snd/seq/dev/snd/timer/dev/autofs/dev/cpu/microcode/dev/vcsa7/dev/vcs7/dev/vcsa6/dev/vcs6/dev/vcsa5/dev/vcs5/dev/vcsa4. . .

Vi kan søge efter alle filer, der slutter på .conf på denne måde:

  • find / -type f -name "*.conf"
Output
/var/lib/ucf/cache/:etc:rsyslog.d:50-default.conf/usr/share/base-files/nsswitch.conf/usr/share/initramfs-tools/event-driven/upstart-jobs/mountall.conf/usr/share/rsyslog/50-default.conf/usr/share/adduser/adduser.conf/usr/share/davfs2/davfs2.conf/usr/share/debconf/debconf.conf/usr/share/doc/apt-utils/examples/apt-ftparchive.conf. . .

Filtrering efter tid og størrelse

Find giver dig en række forskellige måder at filtrere resultaterne efter størrelse og tid på.

Størrelse

Du kan filtrere efter størrelse ved hjælp af parameteren -size.

Vi tilføjer et suffiks i slutningen af vores værdi, der angiver, hvordan vi tæller. Disse er nogle populære muligheder:

  • c: bytes

  • k: Kilobytes

  • M: Megabytes

  • G: Gigabytes

  • b: 512-byte blokke

For at finde alle filer, der er præcis 50 bytes, skal du skrive:

  • find / -size 50c

For at finde alle filer, der er mindre end 50 bytes, kan vi i stedet bruge denne formular:

  • find / -size -50c

For at finde alle filer på mere end 700 megabyte kan vi bruge denne kommando:

  • find / -size +700M

Time

Linux gemmer tidsdata om adgangstidspunkter, ændringstidspunkter og ændringstidspunkter.

  • Access Time: Sidste gang der blev læst eller skrevet i en fil.

  • Modifikationstid: Sidste gang indholdet af filen blev ændret.

  • Ændringstidspunkt: Sidste gang indholdet af filen blev ændret.

  • Ændringstidspunkt: Sidste gang filens inode-metadata blev ændret.

Vi kan bruge disse med parametrene -atime, -mtime og -ctime. Disse kan bruge plus- og minussymbolerne til at angive større end eller mindre end, ligesom vi gjorde med size.

Værdien af denne parameter angiver, hvor mange dage tilbage i tiden du ønsker at søge.

For at finde filer, der har et ændringstidspunkt for en dag siden, skal du skrive:

  • find / -mtime 1

Hvis vi vil have filer, der blev tilgået for mindre end en dag siden, kan vi skrive:

  • find / -atime -1

For at få filer, hvis metainformationer sidst blev ændret for mere end 3 dage siden, skal du skrive:

  • find / -atime -1

For at få filer, hvis metainformationer senest blev ændret for mere end 3 dage siden, skal du skrive:

  • find / -ctime +3

Der er også nogle ledsagende parametre, som vi kan bruge til at angive minutter i stedet for dage:

  • find / -mmin -1

Dette vil give de filer, der er blevet ændret type systemet i det sidste minut.

Find kan også foretage sammenligninger i forhold til en referencefil og returnere dem, der er nyere:

  • find / -newer myfile

Søgning efter ejer og tilladelser

Du kan også søge efter filer efter filens ejer eller gruppens ejer.

Du gør dette ved at bruge henholdsvis parametrene -user og -group. Find en fil, der er ejet af brugeren “syslog”, ved at indtaste:

  • find / -user syslog

Sådan kan vi angive filer, der er ejet af gruppen “shadow”, ved at skrive:

  • find / -group shadow

Vi kan også søge efter filer med bestemte tilladelser.

Hvis vi ønsker at matche et nøjagtigt sæt tilladelser, bruger vi denne form:

  • find / -perm 644

Dette vil matche filer med præcis de angivne tilladelser.

Hvis vi ønsker at angive noget med mindst disse tilladelser, kan du bruge denne form:

  • find / -perm -644

Dette vil matche alle filer, der har yderligere tilladelser. En fil med tilladelser på “744” ville blive matchet i dette tilfælde.

Filtrering efter dybde

I dette afsnit vil vi oprette en mappestruktur i en midlertidig mappe. Den vil indeholde tre niveauer af mapper, med ti mapper på det første niveau. Hver mappe (inklusive den midlertidige mappe) vil indeholde ti filer og ti undermapper.

Skab denne struktur ved at afgive følgende kommandoer:

  • cd
  • mkdir -p ~/test/level1dir{1..10}/level2dir{1..10}/level3dir{1..10}
  • touch ~/test/{file{1..10},level1dir{1..10}/{file{1..10},level2dir{1..10}/{file{1..10},level3dir{1..10}/file{1..10}}}}
  • cd ~/test

Føl dig fri til at tjekke mappestrukturerne med ls og cd for at få et overblik over, hvordan tingene er organiseret. Når du er færdig, skal du vende tilbage til testmappen:

  • cd ~/test

Vi vil arbejde på at finde ud af, hvordan man returnerer specifikke filer fra denne struktur. Lad os først prøve et eksempel med blot en almindelig navnesøgning til sammenligning:

  • find -name file1
Output
./level1dir7/level2dir8/level3dir9/file1./level1dir7/level2dir8/level3dir3/file1./level1dir7/level2dir8/level3dir4/file1./level1dir7/level2dir8/level3dir1/file1./level1dir7/level2dir8/level3dir8/file1./level1dir7/level2dir8/level3dir7/file1./level1dir7/level2dir8/level3dir2/file1./level1dir7/level2dir8/level3dir6/file1./level1dir7/level2dir8/level3dir5/file1./level1dir7/level2dir8/file1. . .

Der er en masse resultater. Hvis vi piper output til en tæller, kan vi se, at der er 1111 resultater i alt:

  • find -name file1 | wc -l
Output
1111

Det er sandsynligvis for mange resultater til at være nyttige for dig i de fleste tilfælde. Lad os prøve at indsnævre den.

Du kan angive den maksimale dybde for søgningen under topniveau-søgningsmappen:

  • find -maxdepth num -name query

For kun at finde “file1” i “level1”-mapperne og derover kan du angive en maks. dybde på 2 (1 for topniveau-mappen og 1 for level1-mapperne):

  • find -maxdepth 2 -name file1
Output
./level1dir7/file1./level1dir1/file1./level1dir3/file1./level1dir8/file1./level1dir6/file1./file1./level1dir2/file1./level1dir9/file1./level1dir4/file1./level1dir5/file1./level1dir10/file1

Det er en langt mere overskuelig liste.

Du kan også angive en minimumsmappe, hvis du ved, at alle filer findes efter et bestemt punkt under den aktuelle mappe:

  • find -mindepth num -name query

Vi kan bruge dette til kun at finde filerne i slutningen af mappeforgreningerne:

  • find -mindepth 4 -name file
Output
./level1dir7/level2dir8/level3dir9/file1./level1dir7/level2dir8/level3dir3/file1./level1dir7/level2dir8/level3dir4/file1./level1dir7/level2dir8/level3dir1/file1./level1dir7/level2dir8/level3dir8/file1./level1dir7/level2dir8/level3dir7/file1./level1dir7/level2dir8/level3dir2/file1. . .

Og på grund af vores forgrenede mappestruktur vil dette give et stort antal resultater (1000).

Du kan kombinere parametrene min og max dybde for at fokusere på et snævert område:

  • find -mindepth 2 -maxdepth 3 -name file
Output
./level1dir7/level2dir8/file1./level1dir7/level2dir5/file1./level1dir7/level2dir7/file1./level1dir7/level2dir2/file1./level1dir7/level2dir10/file1./level1dir7/level2dir6/file1./level1dir7/level2dir3/file1./level1dir7/level2dir4/file1./level1dir7/file1. . .

Udførelse og kombination af find-kommandoer

Du kan udføre en vilkårlig hjælpekommando på alt det, som find matcher, ved at bruge parameteren -exec. Dette kaldes sådan her:

  • find find_parameters -exec command_and_params {} \;
  • find find_parameters -exec command_and_params {} \;

Den {} bruges som en pladsholder for de filer, som find matcher. \; bruges, så find ved, hvor kommandoen slutter:

For eksempel kan vi finde de filer i det foregående afsnit, der havde 644-tilladelser, og ændre dem til at have 664-tilladelser:

  • cd ~/test
  • find . -type f -perm 644 -exec chmod 664 {} \;

Vi kan derefter ændre mappetilladelserne på følgende måde:

  • find . -type d -perm 755 -exec chmod 700 {} \;

Hvis du vil kæde forskellige resultater sammen, kan du bruge kommandoerne -and eller -or. -and antages, hvis den udelades.

  • find . -name file1 -or -name file9

Find filer ved hjælp af Locate

Et alternativ til at bruge find er kommandoen locate. Denne kommando er ofte hurtigere og kan nemt søge i hele filsystemet.

Du kan installere kommandoen på Debian eller Ubuntu med apt:

  • sudo apt install mlocate

På CentOS skal du bruge dnf i stedet:

  • sudo dnf install mlocate

Grunden til, at locate er hurtigere end find, er, at den er afhængig af en database over filerne i filsystemet.

Databasen opdateres normalt en gang om dagen med et cron-script, men du kan opdatere den manuelt ved at skrive:

  • sudo updatedb

Kør denne kommando nu. Husk, at databasen altid skal være opdateret, hvis du vil finde nyligt erhvervede eller oprettede filer.

For at finde filer med locate skal du blot bruge denne syntaks:

  • locate query

Du kan filtrere output på nogle måder.

For eksempel kan du for kun at returnere filer, der indeholder selve forespørgslen, i stedet for at returnere alle filer, der har forespørgslen i de mapper, der fører til den, bruge -b til kun at søge i “grundnavnet”:

  • locate -b query

For at få locate til kun at returnere resultater, der stadig findes i filsystemet (som ikke er blevet fjernet mellem det sidste updatedb-opkald og det aktuelle locate-opkald), skal du bruge -e-flaget:

  • locate -e query

For at få vist statistik over de oplysninger, som locate har katalogiseret, skal du bruge indstillingen -S:

  • locate -S
Output
Database /var/lib/mlocate/mlocate.db:3,315 directories37,228 files1,504,439 bytes in file names594,851 bytes used to store database

Konklusion

Både find og locate er gode måder at finde filer på dit system. Det er op til dig at afgøre, hvilket af disse værktøjer der er passende i den enkelte situation.

Find og locate er kraftfulde kommandoer, som kan styrkes ved at kombinere dem med andre hjælpeprogrammer gennem pipelines. Eksperimentér med filtrering ved at bruge kommandoer som wc, sort og grep.

Similar Posts

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.