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:

  1. c : byte
  2. w : 2 byte
  3. b : 512 byte (standard)
  4. k : 1 KB
  5. M : 1 MB
  6. 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/*'


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow