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.
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
Output1111
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
OutputDatabase /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
.