close

Vinden (Unix)

Spring naar navigatie Spring naar zoeken

find is een commando van de Unix en Unix-achtige besturingssystemen , en meer in het algemeen van de POSIX [1] en GNU [2] systemen , die recursief zoeken naar bestanden en mappen in het bestandssysteem die voldoen aan de gespecificeerde criteria, met vermelding van hun namen of door een opdracht uit te voeren voor de gevonden resultaten. [3]

Syntaxis

De algemene syntaxis van vinden is:

zoek [ opties ] [-] dir1 [ dir2 …] [ richtlijn1 …]

De dir - parameters geven de mappen aan waaruit moet worden gezocht.

De richtlijnparameters specificeren zowel de zoekcriteria als de te ondernemen acties.

Het dubbele streepje --(optioneel) geeft aan dat de volgende parameters niet als opties moeten worden beschouwd.

Opties

Een van de belangrijkste opties:

-H
Als symbolische koppelingen zijn gespecificeerd in de opdrachtparameters , worden de attributen van de echte bestanden of mappen (indien aanwezig) waarnaar wordt verwezen door symbolische koppelingen in aanmerking genomen voor de vergelijkingen, en niet die van symbolische koppelingen. Dit is alleen van toepassing op de parameters van de opdracht find en niet op items die tijdens het zoeken zijn aangetroffen.
-L
In het geval van symbolische links wordt rekening gehouden met de attributen van echte bestanden en/of directories aangegeven door symbolische links, niet die van symbolische links. Dit geldt zowel voor symbolische koppelingen die tijdens het zoeken worden aangetroffen als voor alle symbolische koppelingen die zijn opgegeven in de zoekparameters .

richtlijnen

De richtlijnen geven tests aan die moeten worden uitgevoerd op het bestand of de map in kwestie die al dan niet kunnen worden doorstaan, of ze voeren acties uit of wijzigen zelfs het gedrag van find .

Een van de meest voorkomende richtlijnen zijn:

-name modello
Slaag voor de test als de naam van het bestand of de map overeenkomt met het opgegeven patroon . Het patroon is een tekenreeks volgens de syntaxis voor glob-patronen , bijvoorbeeld *.mp3of main.[ch](voor hoe de tekstshell werkt , moet het worden aangegeven tussen enkele of dubbele aanhalingstekens, of voorafgaand aan elk metateken door een backslash ).
-type tipo
Slaag voor de test als het bestandstype overeenkomt met het aangegeven type. type is een teken dat kan zijn:
-user utente_o_UID
Slaagt voor de test als de eigenaar van het bestand of de map de opgegeven gebruiker is. De gebruiker kan worden aangegeven door zijn gebruikersnaam of door zijn numerieke gebruikersidentificatie .
-group gruppo_o_GID
Slaag voor de test als de groep die aan het bestand of de map is toegewezen, de groep is die is opgegeven. De groep kan worden aangegeven met een naam of met de numerieke groepsidentificatie .
-nouser
Slaag voor de test als de eigenaar van het bestand of de map niet behoort tot de gebruikers die in het systeem zijn gedefinieerd.
-nogroup
Slaag voor de test als de groep die is toegewezen aan het bestand of de map niet behoort tot de groepen die in het systeem zijn gedefinieerd.
-mindepth
Het drukt de minimale diepte van de zoekopdracht binnen de subdirectories uit.
-maxdepth
Het drukt de maximale diepte van de zoekopdracht binnen de subdirectories uit.
-atime giorni
Voldoet aan de test als de laatste leestoegangsdatum tot het bestand of de directory vandaag is minus het opgegeven aantal dagen. Om een ​​latere datum aan te geven, kunt u het voorvoegsel gebruiken +(bijv +10. ). Om een ​​eerdere datum aan te geven, kunt u het voorvoegsel gebruiken -(bijv -4. ).
-mtime giorni
Voldoet aan de test als de laatste wijzigingsdatum van het bestand of de map vandaag is minus het opgegeven aantal dagen. Om een ​​latere datum aan te geven, kunt u het voorvoegsel gebruiken +(bijv +10. ). Om een ​​eerdere datum aan te geven, kunt u het voorvoegsel gebruiken -(bijv -4. ).
-ctime giorni
Slaag voor de test als de aanmaakdatum van het bestand of de map vandaag is minus het opgegeven aantal dagen. Om een ​​latere datum aan te geven, kunt u het voorvoegsel gebruiken +(bijv +10. ). Om een ​​eerdere datum aan te geven, kunt u het voorvoegsel gebruiken -(bijv -4. ).
-newer nome_file
Slaagt voor de test als het bestand of de map die wordt onderzocht een laatste wijzigingsdatum heeft na die van de opgegeven bestandsnaam .
-prune
Het slaagt altijd voor de test, en als het item in kwestie een directory is, daalt het er niet in om te zoeken. Merk op dat zoekopdrachten altijd starten vanuit een directory, dus het is niet voldoende om deze instructie alleen op te geven om recursie te voorkomen, maar er moet een expressie worden geconstrueerd die het mogelijk maakt om de startdirectory af te dalen.
-perm
Wordt gebruikt om te filteren op bestandsrechten. [3]
-print
Schrijft de naam van het bestand of de map naar de standaarduitvoer .
-exec comando [arg1 …];
Voert de opdracht uit die is opgegeven met de parameters arg , waarbij de volgorde daarin wordt vervangen {}door de naam van het bestand of de map in kwestie. De laatste van de parameters moet het teken ;zijn om de term van de richtlijn aan te geven (voor hoe de tekstshell werkt , moet het worden aangegeven tussen enkele aanhalingstekens of dubbele aanhalingstekens, of voorafgegaan door een backslash , bijvoorbeeld met ';'of \;). Bijvoorbeeld
vind. -type f -naam "* .bak" -exec rm {} \;
zoek en verwijder bestanden met extensie .bakdoor het commando rm zo vaak uit te voeren als er bestanden zijn gevonden;
-exec comando [arg1 …] {} +
Voert de opdracht uit die is gespecificeerd met arg- parameters en voegt daaraan, als afzonderlijke parameters, de namen van de gevonden bestanden of mappen toe. Bijvoorbeeld
vind. -type f -naam "* .bak" -exec rm -f {} +
zoekt en verwijdert bestanden met extensie .bakdoor het rm- commando slechts één keer uit te voeren (of zelfs meerdere keren, als het aantal gevonden elementen het maximale aantal parameters overschrijdt dat voor een commando kan worden opgegeven), waardoor het gebruik effectief wordt in combinatie met het xargs- . Deze tweede vorm van de optie -execis echter nieuwer dan de vorige, en dus is het mogelijk dat oude implementaties van find dit niet ondersteunen.

Twee richtlijnen kunnen worden gecombineerd (logische AND) door ze achter elkaar te specificeren of door de operator tussen te voegen -a. De expressie -type f -user alicegeeft bijvoorbeeld aan dat u op zoek bent naar bestanden die bij de gebruiker alice horen . Als de eerste richtlijn de test niet doorstaat, wordt de tweede niet overwogen, volgens de kortsluitingsevaluatie .

Als alternatief kunnen er twee of meer instructies tussen worden geplaatst (logische OR) door de operator tussen te voegen -o. De expressie geeft bijvoorbeeld -name "*.h" -o -user brunoaan dat u op zoek bent naar bestanden of mappen waarvan de naam eindigt op .hof die toebehoren aan de gebruiker bruno . Als de eerste richtlijn de test doorstaat, wordt de tweede niet overwogen, volgens de kortsluitingsevaluatie .

Richtlijnen kunnen worden gegroepeerd door ze tussen ronde haken te plaatsen. De uitdrukking geeft bijvoorbeeld ( -type f -user carla ) -o ( -type d -user daniele )aan dat u op zoek bent naar bestanden die behoren tot gebruiker carla of mappen die toebehoren aan gebruiker daniele . In sommige shells (zoals Bash ), moet je haakjes beschermen door ze vooraf te laten gaan door een backslash , zoals \(en \), omdat dit anders in strijd zou zijn met de gewone shell -syntaxis .

Een richtlijn kan worden ontkend door er een uitroepteken ( !) voor te zetten. De expressie geeft bijvoorbeeld ! -type daan dat u op zoek bent naar andere items dan directory's.

Voorbeelden

Zoek in de huidige map en al zijn submappen naar reguliere bestanden:

vind. -type f -print

Zoek in mappen /tmpen /var/tmphun submappen naar gewone bestanden die minder dan tien dagen geleden voor het laatst zijn gewijzigd en verwijder ze een voor een:

find / tmp / var / tmp -type f -mtime -10 -exec rm -f {} \;

Net als het vorige voorbeeld, maar bestanden in batches verwijderen:

find / tmp / var / tmp -type f -mtime -10 -exec rm -f {} +

Zoek in de huidige directory en al zijn subdirectories naar iets dat geen bestand of directory is (bijv. zoek symbolische links , block devices , named pipes , etc .:

vind. ! \ (-type f -o -type d \) -print

Maak een lijst van alles in de huidige map, zonder naar submappen te gaan (merk op dat het alleen werkt met de huidige map omdat deze de speciale naam heeft .):

vind. ! -naam. -snoeien -afdrukken

Op AIX 6.1 werkt deze syntaxis niet. Om hetzelfde resultaat te verkrijgen, maar ook in andere mappen dan de huidige, voert u het volgende uit:

zoek /tmp/*.err

Alleen de * .err-bestanden die aanwezig zijn in de map / tmp worden weergegeven

Opmerkingen

  1. ^ Zoek in The Open Group Base Specificaties Issue 7 IEEE Std 1003.1-2008 . Ontvangen 20-06-2009 .
  2. ^ Het aanroepen van find - Finds zoeken , in de handleiding van GNU Findutils . Ontvangen 2008-05-19 .
  3. ^ a b Linux find-opdracht: zoek en vind bestanden op ionos.it . Ontvangen 14 juni 2022 .