Bestanden zoeken in Linux met de opdrachtregel

find is een opdracht voor het recursief filteren van objecten in het bestandssysteem op basis van een eenvoudig voorwaardelijk mechanisme. Gebruik find om naar een bestand of map op uw bestandssysteem te zoeken. Met de vlag -exec kunnen bestanden worden gevonden en onmiddellijk worden verwerkt binnen hetzelfde commando.

Vind Linux bestanden op naam of extensie

Gebruik find vanaf de commandoregel om een specifiek bestand op naam of extensie te vinden. Het volgende voorbeeld zoekt naar *.err bestanden in de /home/username/ directory en alle sub-directories:

find /home/username/ -name "*.err"

U zou een gelijkaardige uitvoer in uw console moeten zien:

 /home/username/example.errThe matching file in the /home/username/ directory is "example.err"

Common Linux Find Commands and Syntax

Het find commando neemt gewoonlijk de volgende vorm aan:

find options starting/path expression
  • Het options attribuut controleert het gedrag en de optimalisatie methode van het find proces.
  • Het starting/path attribuut definieert de top level directory waar find begint te filteren.
  • Het expression attribuut controleert de tests die de directory hiërarchie doorzoeken om uitvoer te produceren.

Vind een bestand in Linux met behulp van de bestandsnaam

Om een bestand te vinden met behulp van de bestandsnaam, gebruikt u de syntax find -name filename. Als u het pad weglaat, wordt het bestand over de hele schijf gezocht. U kunt bijvoorbeeld een bestand met de naam example.err vinden in uw directory /home/username met het volgende commando:

find -name example.err

U zou een soortgelijke uitvoer moeten zien:

 ./username/example.err

Vind een bestand in uw huidige directory met behulp van het commando Zoeken

Kijk eens naar de voorbeelddirectorystructuur en -bestanden. Hiernaar wordt verwezen in de voorbeelden van deze handleiding.

 ├── directory_1│ ├── subdirectory_1│ │ └── example.err│ └── example.err├── directory_2│ └── example.err├── directory_3│ └── example.err├── image01.png├── web_files│ ├── app.html│ ├── cb=gapi.loaded_0│ ├── edit.html│ ├── m=_b,_tp│ ├── rs=AA2YrTtgyE1yYXiu-GuLS6sbJdYr0u8VBQ│ ├── rs=AA2YrTvod91nzEJFOvvfJUrn6_vLwwY0bw│ ├── saved_resource.html│ ├── single.html│ └── unnamed.jpg├── web.html└── example.err

Als u in directory_1 bent en u wilt het bestand example.err vinden in de directory of een van zijn submappen, kunt u het volgende commando geven:

find . -name example.err

Uw uitvoer lijkt op het volgende:

 ./example.err./directory_1/example.err

De uitvoer geeft de directory-structuur van directory_1 weer:

 ├── directory_1│ ├── subdirectory_1│ │ └── example.err│ └── example.err

Vind beeldbestanden in Linux met behulp van de opdrachtregel

Refererend naar de bestandsstructuur in de vorige sectie, is er een image met de naam image01.png dat zich in de root (/)s van de mappenstructuur bevindt.

Om het bestand image01.png te vinden, voert u het volgende find commando uit dat alle .png bestanden vindt die zijn opgeslagen in de / directory.

find -name *.png

U zou een soortgelijke uitvoer moeten zien:

 ./image01.png

Wijzig het bestandstype van de afbeelding en zoek naar .jpg bestanden in de hoofddirectory (/):

find -name *.jpg

De uitvoer lijkt op die van het voorbeeld. Raadpleeg de voorbeeldmapstructuur in de vorige sectie om de locatie van het bestand te zien.

 ./web_files/unnamed.jpg

Een leeg bestand in uw directory vinden met behulp van de opdrachtregel

Om een leeg bestand in uw directory te vinden met behulp van de opdrachtregel, voert u het volgende commando uit:

find . -type f -empty

Als er geen uitvoer wordt geretourneerd, dan is er geen leeg bestand in uw huidige directory.

Opties en optimalisaties voor het vinden van bestanden in Linux met behulp van de opdrachtregel

De standaardconfiguratie voor find negeert symbolische koppelingen. Als u wilt dat find symbolische koppelingen volgt en teruggeeft, voegt u de optie -L toe aan het commando, zoals hieronder getoond:

find -O3 -L /var/www/ -name "*.html"

Dit commando schakelt het maximale optimalisatieniveau (-O3) in en staat find toe symbolische koppelingen te volgen (-L). find doorzoekt de hele mapstructuur onder /var/www/ naar bestanden die eindigen op .html.

find optimaliseert zijn filterstrategie om de prestaties te verbeteren. Er zijn drie optimalisatieniveaus die door de gebruiker kunnen worden geselecteerd: -O1, -O2 en -O3. De optimalisatie -O1 is de standaard en dwingt find te filteren op bestandsnaam voordat alle andere tests worden uitgevoerd.

Optimalisatie op het niveau -O2 geeft voorrang aan bestandsnaamfilters, zoals in -O1, en voert vervolgens alle bestandstype-filters uit voordat wordt verdergegaan met andere voorwaarden die meer middelen vergen. Met optimalisatie op niveau -O3 kan find de zwaarste optimalisatie uitvoeren en worden alle tests opnieuw gerangschikt op basis van hun relatieve kosten en de waarschijnlijkheid van hun succes.

Command Description
-O1 Filter eerst op bestandsnaam (standaard).
-O2 Bestandsnaam eerst, dan bestandstype.
-O3 Mogelijkheid voor find om het zoeken automatisch te herschikken op basis van efficiënt gebruik van bronnen en waarschijnlijkheid. van succes
-maxdepth X Zoek in de huidige directory en in alle submappen X niveaus diep.
-iname Zoek zonder rekening te houden met de tekstcase.
-not Rugkeer alleen resultaten die niet met de testcase overeenkomen.
-type f Zoek naar bestanden.
-type d Zoek naar directory’s.

Vind bestanden in Linux op wijzigingsdatum met behulp van de opdrachtregel

De opdracht find kan een directoryhiërarchie filteren op basis van wanneer een bestand voor het laatst is gewijzigd. Het volgende commando vindt bijvoorbeeld elk bestand met de extensie .err dat de laatste 7 dagen is gewijzigd:

find / -name "*err" -mtime -7

Het voorbeeldcommando geeft de volgende uitvoer:

 /home/username/directory_3/example.err/home/username/username/example.err/home/username/username/directory_2/example.err/home/username/username/directory_1/example.err/home/username/username/directory_1/subdirectory_1/example.err

Gebruik Grep om bestanden in Linux te vinden met de opdrachtregel

Het find commando kan alleen de directoryhiërarchie filteren op basis van de naam en metagegevens van een bestand. Als u moet zoeken op basis van de inhoud van het bestand, kunt u een programma alsegrep gebruiken. Neem het volgende voorbeeld:

find . -type f -exec grep "test" '{}' \; -print

Deze opdracht doorzoekt elk object in de huidige directoryhiërarchie (.) dat een bestand is (-type f) en voert dan de opdracht grep "test" uit voor elk bestand dat aan de voorwaarden voldoet. De bestanden die aan de voorwaarden voldoen, worden op het scherm afgedrukt (-print). De accolades ({}) zijn een plaatshouder voor de resultaten van de zoekresultaten. De {} zijn tussen enkele aanhalingstekens geplaatst (') om te voorkomen dat grep een misvormde bestandsnaam krijgt. Het -exec commando wordt afgesloten met een puntkomma (;), die moet worden ge-escaped (\;) om interpretatie door de shell te voorkomen.

Het bestand dat in het voorbeeld wordt gebruikt (example.err) heeft tekst in zich dat “test” zegt. Wanneer u het voorbeeldcommando uitvoert, ziet u een soortgelijke uitvoer:

 test./directory_3/example.errtest./example.errtest./directory_2/example.errtest./directory_1/example.errtest./directory_1/subdirectory_1/example.err

Grep heeft elk bestand in de huidige werkdirectory geïdentificeerd dat de tekenreeks “test” bevat.

Opmerking

Voor de implementatie van de -exec optie door het find commando, kon u een soortgelijke uitvoer genereren als in het voorbeeld hierboven met het xargs commando:

find . -type f -print | xargs grep "test"

Bestanden verwerken en vinden met het Find commando in Linux

De -exec optie voert commando’s uit tegen elk object dat overeenkomt met de find expressie. Neem het volgende voorbeeld:

find . -name "example.err" -exec chmod o+r '{}' \;

Dit filtert elk object in de huidige hiërarchie (.) op bestanden met de naam rc.conf en voert het chmod o+r commando uit om de bestandsrechten van de resultaten van het find commando te wijzigen.

Het voorbeeldcommando voert de -exec optie uit in de hoofddirectory van het find proces. Gebruik -execdir om het opgegeven commando uit te voeren in de directory waar de overeenkomst zich bevindt. Dit kan beveiligingsproblemen verlichten en betere prestaties opleveren voor sommige bewerkingen.

De -exec of -execdir opties worden zonder verdere prompts uitgevoerd. Als u liever wordt gevraagd voordat actie wordt ondernomen, vervangt u -exec door -ok of -execdir door -okdir.

Hoe bestanden zoeken en verwijderen met de Linux Command Line

Voorzichtig

Gebruik deze optie met uiterste voorzichtigheid.

Voeg de optie -delete toe aan het eind van een overeenkomstige uitdrukking om alle overeenkomende bestanden te verwijderen. Gebruik deze optie wanneer u er zeker van bent dat de resultaten alleen overeenkomen met de bestanden die u wilt verwijderen.

In het onderstaande voorbeeld zoekt find recursief alle bestanden in de hiërarchie vanaf de huidige directory en verwijdert alle bestanden die eindigen met de extensie .err:

find . -name "*.err" -delete

Heeft u nog steeds een paar vragen?

Maak deel uit van onze Community en stel uw vragen zodat andere Linode- en Linux-enthousiastelingen u kunnen helpen.

Gerelateerde vragen:

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.