Find

Från Wiki.linux.se
Hoppa till navigering Hoppa till sök

find - Sök efter filer och kataloger

Kommandot `find` används för att söka efter filer och kataloger i ett filsystem baserat på olika villkor.

Syntax

find [SÖKVÄG]... [UTTRYCK]...

Beskrivning

Kommandot `find` söker efter filer i en kataloghierarki. Du kan ange olika villkor för att filtrera sökresultaten. Detta kommando är mycket kraftfullt och flexibelt, vilket gör det möjligt att utföra komplexa sökningar och åtgärder på filer och kataloger.

Alternativ

Kommandot `find` stöder många alternativ som kan användas för att justera sökningen:

  • `-H` - Följ symboliska länkar som specificeras på kommandoraden.
  • `-L` - Följ alla symboliska länkar.
  • `-P` - Följ inte symboliska länkar (standardbeteende).
  • `-D debugopts` - Skriv ut detaljerad felsökningsinformation.
  • `-Olevel` - Optimera sökningen; nivå 0 (standard) till nivå 3.

Uttryck

`find`-kommandot använder uttryck för att definiera sökvillkor. Här är en omfattande lista över de vanligaste uttrycken:

  • `-name NAMN` - Sök efter filer med ett specifikt namn. Du kan använda jokertecken för att matcha mönster, t.ex. `*.txt` för att hitta alla textfiler.
  • `-iname NAMN` - Sök efter filer med ett specifikt namn, ignorera skiftlägeskänslighet. Användbart i situationer där du inte är säker på filnamnets skiftläge.
  • `-type TYP` - Sök efter en viss typ av filer. Vanliga typer inkluderar:
 * `f` - vanliga filer
 * `d` - kataloger
 * `l` - symboliska länkar
 * `c` - teckenfiler
 * `b` - blockfiler
 * `s` - socketfiler
 * `p` - named pipes
  • `-perm MODE` - Sök efter filer med specifika rättigheter. MODE kan anges på olika sätt, t.ex. `755` för vanliga rättigheter eller `+x` för alla filer med exekveringsrättigheter.
  • `-user ANVÄNDARE` - Sök efter filer som ägs av en viss användare. Du kan ange användarnamnet eller UID.
  • `-group GRUPP` - Sök efter filer som tillhör en viss grupp. Du kan ange gruppnamnet eller GID.
  • `-mtime n` - Sök efter filer som ändrades för n dagar sedan. Använd `+n` för filer som ändrades för mer än n dagar sedan och `-n` för filer som ändrades för mindre än n dagar sedan.
  • `-atime n` - Sök efter filer som åtkomstades för n dagar sedan, på samma sätt som `-mtime`.
  • `-ctime n` - Sök efter filer vars metadata ändrades för n dagar sedan.
  • `-size n` - Sök efter filer av en viss storlek. Använd `c` för byte, `k` för kilobyte, `M` för megabyte och `G` för gigabyte.
  • `-exec KOMMANDO {} \;` - Utför ett kommando på varje fil som matchar. `{}` ersätts med filens namn. Exemplet `-exec rm {} \;` tar bort varje fil som matchar.
  • `-ok KOMMANDO {} \;` - Fråga användaren innan du utför ett kommando på varje fil som matchar.
  • `-delete` - Ta bort filer som matchar. Används med försiktighet eftersom det permanent tar bort filer.
  • `-print` - Skriv ut sökresultaten. Detta är standardåtgärden om inget annat anges.

Fler avancerade alternativ

För mer avancerad användning kan `find` kombineras med logiska operatorer och ytterligare alternativ:

  • `-and` - Kombinera flera villkor med AND-logik. Kan även anges med `-a`.
  • `-or` - Kombinera flera villkor med OR-logik. Kan även anges med `-o`.
  • `-not` - Invertera ett villkor. Kan även anges med `!`.
  • `-maxdepth N` - Begränsa sökningen till en maximal djupnivå på N.
  • `-mindepth N` - Begränsa sökningen till en minimal djupnivå på N.
  • `-newer F` - Sök efter filer som är nyare än filen F.
  • `-cnewer F` - Sök efter filer vars metadata ändrades senare än filen F.
  • `-anewer F` - Sök efter filer som åtkomstades senare än filen F.
  • `-empty` - Sök efter tomma filer eller kataloger.
  • `-path MÖNSTER` - Sök efter filer som matchar en specifik sökväg.
  • `-ipath MÖNSTER` - Sök efter filer som matchar en specifik sökväg, ignorera skiftlägeskänslighet.
  • `-regex MÖNSTER` - Sök efter filer som matchar ett reguljärt uttryck.
  • `-iregex MÖNSTER` - Sök efter filer som matchar ett reguljärt uttryck, ignorera skiftlägeskänslighet.

Exempel

Här är några praktiska exempel som visar hur du kan använda `find`-kommandot:

  • För att hitta alla filer med namnet `fil.txt`:

find / -name fil.txt

Detta kommando söker i hela filsystemet efter filer med namnet `fil.txt`.
  • För att hitta alla kataloger:

find / -type d

Detta kommando söker i hela filsystemet efter kataloger.
  • För att hitta alla filer större än 100 MB:

find / -size +100M

Detta kommando söker efter alla filer större än 100 megabyte.
  • För att hitta filer ägda av användaren `användare`:

find / -user användare

Detta kommando söker efter filer som ägs av användaren `användare`.
  • För att hitta och ta bort alla filer med ändelsen `.tmp`:

find / -name "*.tmp" -delete

Detta kommando söker efter alla filer med ändelsen `.tmp` och tar bort dem.
  • För att hitta alla filer ändrade inom de senaste 7 dagarna och lista dem:

find / -mtime -7 -print

Detta kommando söker efter filer som har ändrats inom de senaste 7 dagarna och listar dem.
  • För att hitta alla filer och utföra ett kommando på varje matchande fil:

find / -name "*.log" -exec rm -f {} \;

Detta kommando söker efter alla filer med ändelsen `.log` och tar bort dem.
  • För att hitta alla tomma filer och kataloger:

find / -empty

Detta kommando söker efter alla tomma filer och kataloger i hela filsystemet.
  • För att hitta alla filer med åtkomsttiden senare än en specifik fil:

find / -anewer referensfil

Detta kommando söker efter alla filer som har åtkomstats senare än filen `referensfil`.
  • För att hitta alla filer som matchar ett specifikt reguljärt uttryck:

find / -regex ".*[0-9]{4}-[0-9]{2}-[0-9]{2}.*"

Detta kommando söker efter filer vars namn matchar datumformatet `åååå-mm-dd`.
  • För att söka efter filer med en specifik rättighet:

find / -perm 755

Detta kommando söker efter alla filer med rättigheten `755`.
  • För att söka i en specifik katalog och dess underkataloger:

find /home/användare/dokument -name "*.pdf"

Detta kommando söker efter alla PDF-filer i katalogen `/home/användare/dokument` och dess underkataloger.

Skillnader mellan macOS och Linux

Det finns några viktiga skillnader att tänka på när man använder `find`-kommandot på macOS jämfört med Linux:

  • **Standardinstallationer**: På de flesta Linux-distributioner är `find`-kommandot en del av GNU findutils, medan macOS använder BSD-versionen av `find`. Detta innebär att vissa alternativ och beteenden kan skilja sig åt.
  • **Alternativ för symboliska länkar**: På Linux kan du använda `-L`, `-P`, och `-H` för att styra hur symboliska länkar hanteras. På macOS stöds också dessa alternativ, men deras beteende kan skilja sig något på grund av de underliggande skillnaderna i operativsystemens filsystemshantering.
  • **-iname och -ipath**: Dessa alternativ är tillgängliga på både Linux och macOS, men eftersom macOS filsystem är skiftlägesokänsligt som standard, kan resultaten skilja sig när du använder dessa alternativ.
  • **-regex och -iregex**: Reguljära uttryck hanteras på liknande sätt på både Linux och macOS, men det kan finnas små skillnader i hur specifika mönster tolkas beroende på versionen av `find` och de reguljära uttrycksbibliotek som används.
  • **Prestanda och optimering**: Linux och macOS kan ha olika prestandakarakteristika beroende på hur deras filsystem och sökalgoritmer är implementerade. macOS använder HFS+ eller APFS, medan Linux vanligtvis använder ext4, Btrfs, XFS eller andra filsystem. Detta kan påverka hur snabbt `find`-kommandot utför sina sökningar.
  • **Funktioner och flaggor**: Vissa GNU-specifika flaggor och funktioner kan saknas i BSD-versionen av `find` som används på macOS. Till exempel kan `-printf`-alternativet, som finns i GNU findutils, saknas i macOS `find`.

Här är några exempel som visar skillnaderna:

  • På Linux kan du använda `-printf` för att formatera utdata:

find . -name "*.txt" -printf "%p\n"

Detta fungerar inte på macOS.
  • På macOS kan du behöva använda en annan syntax eller rörledning för att uppnå samma resultat:

find . -name "*.txt" -exec echo {} \;

  • Användning av `-exec` på macOS kan kräva att du använder `+` istället för `\;` för att effektivisera utförandet:

find . -name "*.txt" -exec ls -l {} +

Det är alltid bra att konsultera `man`-sidan för `find` på din specifika plattform för att se vilka alternativ och funktioner som är tillgängliga.

Felsökning

Om du får ett felmeddelande när du använder `find`, kontrollera följande:

  • Att du har rättigheter att läsa de kataloger du söker i. Om du inte har tillräckliga rättigheter kan du få åtkomstfel.
  • Att syntaxen för ditt uttryck är korrekt. Kontrollera att du använder korrekta alternativ och parametrar.
  • Att du inte använder för många symboliska länkar utan att följa dem, om det är nödvändigt.

Se även

  • grep - Sök efter mönster i filer.
  • locate - Hitta filer snabbt med en databas.
  • xargs - Bygg och kör kommandon från standardinmatning.
  • chmod - Ändra filrättigheter.
  • chown - Ändra ägande av filer och kataloger.

Källor