Sök…
Introduktion
find är ett kommando för att rekursivt söka i en katalog efter filer (eller kataloger) som matchar ett kriterium och sedan utföra vissa åtgärder på de valda filerna.
hitta search_path choice_criteria action
Syntax
- hitta [-H] [-L] [-P] [-D debugopts] [-Olevel] [path ...] [expression]
Söker efter en fil efter namn eller tillägg
För att hitta filer / kataloger med ett specifikt namn, relativt pwd
:
$ find . -name "myFile.txt"
./myFile.txt
För att hitta filer / kataloger med ett specifikt tillägg använder du ett jokertecken:
$ find . -name "*.txt"
./myFile.txt
./myFile2.txt
För att hitta filer / kataloger som matchar ett av många tillägg, använd or
flagga:
$ find . -name "*.txt" -o -name "*.sh"
För att hitta filer / kataloger som namn börjar med abc och slutar med ett alfabetecken efter en enstaka siffra:
$ find . -name "abc[a-z][0-9]"
Hitta alla filer / kataloger som finns i en specifik katalog
$ find /opt
För att söka efter filer bara (inte kataloger), använd -type f
:
find /opt -type f
För att söka efter kataloger (inte vanliga filer) använder du -type d
:
find /opt -type d
Hitta filer efter typ
-type f
flaggan -type f
att hitta filer
$ find . -type f
-type d
flaggan -type d
att hitta kataloger
$ find . -type d
-type b
flaggan -type b
att hitta blockenheter
$ find /dev -type b
Använd flaggan -type l
att hitta symlänkar
$ find . -type l
Utför kommandon mot en hittad fil
Ibland måste vi köra kommandon mot många filer. Detta kan göras med xargs
.
find . -type d -print | xargs -r chmod 770
Ovanstående kommando hittar rekursivt alla kataloger ( -type d
) relativt .
(som är din nuvarande arbetskatalog) och kör chmod 770
på dem. Alternativet -r
anger för xargs
att inte köra chmod
om find
inte hittade några filer.
Om dina filnamn eller kataloger har ett mellanslagstecken kan det här kommandot kvävas; en lösning är att använda följande
find . -type d -print0 | xargs -r -0 chmod 770
I exemplet -print0
anger flaggorna -print0
och -0
att filnamnen ska separeras med en null
och tillåter användning av specialtecken, som mellanslag, i filnamnen. Detta är en GNU-förlängning och fungerar kanske inte i andra versioner av find
och xargs
.
Det föredragna sättet att göra detta är att hoppa xargs
kommandot xargs
och låta find
ringa själva delprocessen:
find . -type d -exec chmod 770 {} \;
Här är {}
en platshållare som indikerar att du vill använda filnamnet vid den punkten. find
kommer att köra chmod
för varje fil individuellt.
Du kan alternativt skicka alla filnamn till ett enda samtal av chmod
, med
find . -type d -exec chmod 770 {} +
Detta är också beteendet hos ovanstående xargs
utdrag. (För att ringa på varje fil individuellt kan du använda xargs -n1
).
Ett tredje alternativ är att låta bash loop över listan över filnamn find
output:
find . -type d | while read -r d; do chmod 770 "$d"; done
Detta är syntaktiskt det mest klumpiga, men praktiska när du vill köra flera kommandon på varje hittad fil. Detta är dock osäkert inför filnamn med udda namn.
find . -type f | while read -r d; do mv "$d" "${d// /_}"; done
vilket kommer att ersätta alla mellanslag i filnamn med understreck. (Detta exempel fungerar inte heller om det finns utrymmen i ledande katalognamn.)
Problemet med ovanstående är att while read -r
förväntar sig en post per rad, men filnamn kan innehålla nya linjer (och också kommer read -r
att förlora alla bakomliggande blanksteg). Du kan fixa detta genom att vända saker:
find . -type d -exec bash -c 'for f; do mv "$f" "${f// /_}"; done' _ {} +
På detta sätt får -exec
filnamnen i en form som är helt korrekt och bärbar; bash -c
tar emot dem som ett antal argument, som kommer att finnas i $@
, korrekt citerade etc. (Skriptet måste naturligtvis hantera dessa namn; alla variabler som innehåller ett filnamn måste vara i dubbel citat.)
Det mystiska _
är nödvändigt eftersom det första argumentet för att bash -c 'script'
används för att fylla $0
.
Hitta fil efter åtkomst / modifieringstid
På ett ext
filsystem har varje fil en lagrad åtkomst, modifiering och (status) Ändringstid som är associerad med den - för att visa denna information kan du använda stat myFile.txt
; Med hjälp av flaggor inom find kan vi söka efter filer som har ändrats inom ett visst tidsintervall.
Så här hittar du filer som har ändrats under de senaste två timmarna:
$ find . -mmin -120
Så här hittar du filer som inte har ändrats under de senaste två timmarna:
$ find . -mmin +120
Exemplet ovan söker endast på den modifierade tiden - för att söka på en ccess-tid, eller c- hängde tider, använd a
eller c
enlighet därmed.
$ find . -amin -120
$ find . -cmin +120
Allmänt format:
-mmin n
: Fil modifierades n minuter sedan
-mmin -n
: Filen ändrades för mindre än n minuter sedan
-mmin +n
: Filen modifierades för mer än n minuter sedan
Hitta filer som har ändrats under de senaste två dagarna:
find . -mtime -2
Hitta filer som inte har ändrats under de senaste två dagarna
find . -mtime +2
Använd -atime
och -ctime
för åtkomsttid respektive statusändringstid.
Allmänt format:
-mtime n
: Filen ändrades för nx24 timmar sedan
-mtime -n
: Filen ändrades för mindre än nx24 timmar sedan
-mtime +n
: Filen modifierades för mer än nx24 timmar sedan
Hitta filer som har ändrats inom en rad datum , från 2007-06-07 till 2007-06-08:
find . -type f -newermt 2007-06-07 ! -newermt 2007-06-08
Hitta filer som har åtkomst i en rad tidsstämplar (med filer som tidsstämpel), från 1 timme sedan till 10 minuter sedan:
touch -t $(date -d '1 HOUR AGO' +%Y%m%d%H%M.%S) start_date
touch -t $(date -d '10 MINUTE AGO' +%Y%m%d%H%M.%S) end_date
timeout 10 find "$LOCAL_FOLDER" -newerat "start_date" ! -newerat "end_date" -print
Allmänt format:
-newerXY reference
: Jämför tidsstämpeln för den aktuella filen med referens. XY
kan ha ett av följande värden: at
(åtkomsttid), mt
(modifieringstid), ct
(ändringstid) och mer. reference
är namnet på en fil som vill jämföra den angivna tidsstämpeln (åtkomst, modifiering, ändring) eller en sträng som beskriver en absolut tid.
Hitta filer efter specifikt tillägg
För att hitta alla filer i en viss utsträckning i den aktuella väg du kan använda följande find
syntax. Det fungerar genom att använda bash's
inbyggda glob
att matcha alla namn som har .extension
.
find /directory/to/search -maxdepth 1 -type f -name "*.extension"
Gör för att hitta alla filer av typen .txt
från den aktuella katalogen
find . -maxdepth 1 -type f -name "*.txt"
Hitta filer efter storlek
Hitta filer större än 15MB:
find -type f -size +15M
Hitta filer mindre än 12 kB:
find -type f -size -12k
Hitta filer exakt i storlek 12KB:
find -type f -size 12k
Eller
find -type f -size 12288c
Eller
find -type f -size 24b
Eller
find -type f -size 24
Allmänt format:
find [options] -size n[cwbkMG]
Hitta filer med n-blockstorlek, där + n betyder mer än n-block, -n betyder mindre än n-block och n (utan tecken) betyder exakt n-block
Block storlek:
-
c
: byte -
w
: 2 byte -
b
: 512 byte (standard) -
k
: 1 KB -
M
: 1 MB -
G
: 1 GB
Filtrera sökvägen
Parametern- -path
tillåter att ange ett mönster som matchar sökvägen till resultatet. Mönstret kan matcha också själva namnet.
Så här hittar du bara filer som innehåller log
helst i deras sökväg (mapp eller namn):
find . -type f -path '*log*'
Så här hittar du bara filer i en mapp som heter log
(på vilken nivå som helst):
find . -type f -path '*/log/*'
Så här hittar du bara filer i en mapp som heter log
eller data
:
find . -type f -path '*/log/*' -o -path '*/data/*'
För att hitta alla filer utom de som finns i en mapp som heter bin
:
find . -type f -not -path '*/bin/*'
För att hitta alla filer alla filer utom de som finns i en mapp som heter bin
eller loggfiler:
find . -type f -not -path '*log' -not -path '*/bin/*'