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:
-
c
: bytes -
w
: 2 bytes -
b
: 512 bytes (standaard) -
k
: 1 KB -
M
: 1 MB -
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/*'