Zoeken…


Invoering

find is een opdracht om recursief in een map te zoeken naar bestanden (of mappen) die overeenkomen met een criterium en vervolgens een actie uit te voeren op de geselecteerde bestanden.

zoek actie zoekpad selectiecriteria

Syntaxis

  • zoek [-H] [-L] [-P] [-D debugopts] [-Olevel] [pad ...] [expressie]

Zoeken naar een bestand op naam of extensie

Bestanden / mappen zoeken met een specifieke naam, relatief ten opzichte van pwd :

$ find . -name "myFile.txt"
./myFile.txt

Gebruik een jokerteken om bestanden / mappen met een specifieke extensie te vinden:

$ find . -name "*.txt"
./myFile.txt
./myFile2.txt

Gebruik de vlag or om bestanden / mappen te vinden die overeenkomen met een van de vele extensies:

$ find . -name "*.txt" -o -name "*.sh"

Bestanden / mappen zoeken waarvan de naam begint met abc en eindigt met één alfanumeriek teken dat volgt op een cijfer:

$ find . -name "abc[a-z][0-9]"

Om alle bestanden / mappen in een specifieke map te vinden

$ find /opt

Gebruik -type f om alleen naar bestanden (geen mappen) te zoeken:

find /opt -type f

Gebruik -type d om alleen naar mappen te zoeken (geen reguliere bestanden):

find /opt -type d

Bestanden zoeken op type

Gebruik de vlag -type f om bestanden te vinden

$ find . -type f

Gebruik de vlag -type d om mappen te vinden

$ find . -type d

Gebruik de vlag -type b blokapparaten te vinden

$ find /dev -type b

Gebruik de vlag -type l om symlinks te vinden

$ find . -type l

Opdrachten uitvoeren tegen een gevonden bestand

Soms moeten we opdrachten uitvoeren voor veel bestanden. Dit kan gedaan worden met xargs .

find . -type d -print | xargs -r chmod 770

De bovenstaande opdracht zal recursief alle mappen ( -type d ) vinden ten opzichte van . (wat uw huidige werkmap is) en voer chmod 770 daarop uit. De -r optie geeft om xargs niet lopen chmod als find geen bestanden vond.

Als uw bestandsnamen of mappen een spatie bevatten, kan dit commando stikken; een oplossing is om het volgende te gebruiken

find . -type d -print0 | xargs -r -0 chmod 770

In het bovenstaande voorbeeld geven de vlaggen -print0 en -0 aan dat de bestandsnamen worden gescheiden door een null byte en kunnen speciale tekens, zoals spaties, in de bestandsnamen worden gebruikt. Dit is een GNU-extensie en werkt mogelijk niet in andere versies van find en xargs .


De beste manier om dit te doen is om de opdracht xargs over te slaan en het subproces zelf te laten find :

find . -type d -exec chmod 770 {} \;

Hier is {} een tijdelijke aanduiding die aangeeft dat u op dat moment de bestandsnaam wilt gebruiken. find zal chmod op elk bestand afzonderlijk uitvoeren.

U kunt ook alle bestandsnamen doorgeven aan een enkele aanroep van chmod , met behulp van

find . -type d -exec chmod 770 {} +

Dit is ook het gedrag van de bovenstaande xargs fragmenten. (Om elk bestand afzonderlijk aan te roepen, kunt u xargs -n1 ).


Een derde optie is om bash in een lus over de lijst met bestandsnamen te laten find :

find . -type d | while read -r d; do chmod 770 "$d"; done

Dit is syntactisch de meest onhandige, maar handig wanneer u meerdere opdrachten op elk gevonden bestand wilt uitvoeren. Dit is echter onveilig voor bestandsnamen met vreemde namen.

find . -type f | while read -r d; do mv "$d" "${d// /_}"; done

waarmee alle spaties in bestandsnamen worden vervangen door onderstrepingstekens. (Dit voorbeeld werkt ook niet als er spaties in de namen van de hoofddirectory staan .)

Het probleem met het bovenstaande is dat, while read -r één regel per regel verwacht, maar bestandsnamen nieuwe regels kunnen bevatten (en ook, zal read -r alle witruimte verliezen). U kunt dit oplossen door dingen om te draaien:

find . -type d -exec bash -c 'for f; do mv "$f" "${f// /_}"; done' _ {} +

Op deze manier ontvangt de -exec de bestandsnamen in een vorm die volledig correct en draagbaar is; de bash -c ontvangt ze als een aantal argumenten, die te vinden zijn in $@ , correct geciteerd enz. (Het script moet deze namen natuurlijk correct verwerken; elke variabele die een bestandsnaam bevat, moet in het dubbele zijn citaten.)

Het mysterieuze _ is nodig omdat het eerste argument voor bash -c 'script' wordt gebruikt om $0 te vullen.

Bestand zoeken op toegang / aanpassingstijd

Op een ext bestandssysteem heeft elk bestand een opgeslagen Toegang, Wijziging en (Status) Verander tijd die eraan is gekoppeld - om deze informatie te bekijken kunt u stat myFile.txt ; met behulp van vlaggen binnen find , kunnen we zoeken naar bestanden die binnen een bepaald tijdsbereik zijn gewijzigd.

Om bestanden die zijn gewijzigd in de laatste 2 uur te vinden:

$ find . -mmin -120

Bestanden zoeken die niet zijn gewijzigd in de afgelopen 2 uur:

$ find . -mmin +120

Het bovenstaande voorbeeld zoekt alleen op de gewijzigde tijd - om te zoeken op een ccess tijden, of c opgehangen tijde over a of c dienovereenkomstig.

$ find . -amin -120
$ find . -cmin +120

Algemeen formaat:

-mmin n : bestand is n minuten geleden gewijzigd
-mmin -n : Bestand is minder dan n minuten geleden gewijzigd
-mmin +n : bestand is meer dan n minuten geleden gewijzigd


Zoeken naar bestanden die zijn gewijzigd in de laatste 2 dagen:

find . -mtime -2

Zoek naar bestanden die de afgelopen twee dagen niet zijn gewijzigd

find . -mtime +2

Gebruik respectievelijk -atime en -ctime voor toegangstijd en tijd voor statusverandering.

Algemeen formaat:

-mtime n : bestand is nx24 uur geleden gewijzigd
-mtime -n : Bestand is minder dan nx24 uur geleden gewijzigd
-mtime +n : bestand is meer dan nx24 uur geleden gewijzigd

Zoek naar bestanden die binnen een datumbereik zijn gewijzigd, van 2007-06-07 tot 2007-06-08:

find . -type f -newermt 2007-06-07 ! -newermt 2007-06-08  

Zoek naar bestanden die binnen een bereik van tijdstempels worden geopend (met bestanden als tijdstempel), van 1 uur geleden tot 10 minuten geleden:

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  

Algemeen formaat:

-newerXY reference : vergelijkt de tijdstempel van het huidige bestand met referentie. XY zou een van de volgende waarden kunnen hebben: at (toegangstijd), mt (aanpassingstijd), ct (tijd wijzigen) en meer. reference is de naam van een bestand dat we willen vergelijken met de opgegeven tijdstempel (toegang, wijziging, wijziging) of een tekenreeks die een absolute tijd beschrijft.

Bestanden zoeken op specifieke extensie

Om alle bestanden van een bepaald toestel binnen het huidige pad kunt u gebruikmaken van het volgende te vinden find syntax. Het werkt door gebruik te maken van bash's ingebouwde glob constructie om alle namen met de .extension .

find /directory/to/search -maxdepth 1 -type f -name "*.extension"

Als u alle bestanden van het type .txt in de huidige map wilt vinden, doet u

find . -maxdepth 1 -type f -name "*.txt"

Bestanden zoeken op grootte

Bestanden zoeken die groter zijn dan 15 MB:

find -type f -size +15M

Zoek bestanden van minder dan 12 KB:

find -type f -size -12k

Vind bestanden met een grootte van 12 KB:

find -type f -size 12k

Of

find -type f -size 12288c

Of

find -type f -size 24b

Of

find -type f -size 24

Algemeen formaat:

find [options] -size n[cwbkMG]

Zoek bestanden met n-blokgrootte, waarbij + n meer betekent dan n-blok, -n betekent minder dan n-blok en n (zonder enig teken) betekent precies n-blok

Blokgrootte:

  1. c : bytes
  2. w : 2 bytes
  3. b : 512 bytes (standaard)
  4. k : 1 KB
  5. M : 1 MB
  6. G : 1 GB

Filter het pad

Met de parameter -path kunt u een patroon opgeven dat overeenkomt met het pad van het resultaat. Het patroon kan ook overeenkomen met de naam zelf.

Om alleen bestanden met log ergens in hun pad te vinden (map of naam):

find . -type f -path '*log*'

Om alleen bestanden te vinden in een map met de naam log (op elk niveau):

find . -type f -path '*/log/*'

Om alleen bestanden te vinden in een map met de naam log of data :

find . -type f -path '*/log/*' -o -path '*/data/*'

Om alle bestanden te vinden, behalve die in een map met de naam bin :

find . -type f -not -path '*/bin/*'

Om alle bestanden te vinden, behalve de bestanden in een map met de naam bin of logbestanden:

find . -type f -not -path '*log' -not -path '*/bin/*'


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow