Vinden (Unix)
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:
- b: apparaat blokkeren
- c: tekenapparaat
- d: map
- l: symbolische link
- p: benoemde pijp
- f: normaal bestand
- s: socket in Unix-domein.
- -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]
- 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
- ^ Zoek in The Open Group Base Specificaties Issue 7 IEEE Std 1003.1-2008 . Ontvangen 20-06-2009 .
- ^ Het aanroepen van find - Finds zoeken , in de handleiding van GNU Findutils . Ontvangen 2008-05-19 .
- ^ a b Linux find-opdracht: zoek en vind bestanden op ionos.it . Ontvangen 14 juni 2022 .