Pour appliquer une logique ET, spécifier plusieurs filtres
# Dont le nom commence par "f" ET pèse 512k
find -name "f*" -size 512k
Pour appliquer une logique OU, utiliser -o
.
# Dont le nom commence par "f" OU pèse 512k
find -name "f*" -o -size 512k
Pour appliquer un NON, utiliser -not
# Dont le nom ne commence pas par "f"
find -not -name "f*"
-name FILENAME
Filtrer les fichiers suivant leur nom (sensible à la cassse).
Accepte un wildcard
find styles -name '*.less' -exec lessc -x {} \; > combined.css # combine + minify
-iname FILENAME
Même principe que -name mais insensible à la casse
find /usr/share -name '*.jpg'
-regex REGEX
Filtrer les fichiers suivant une regex
-mindepth N
Pronfondeur minimale. Permet notamment d’exclure le répertoire parent du résultat avec -mindepth 1
-maxdepth N
Limiter le nombre de récursion.
# Ne rechercher que dans le répertoire /etc (et non les sous-répertoires)
find /etc -mindepth 1 -maxpdeth 1 -name passwd
-mtime HEURES
Filtrer les fichiers en fonction de leur date de modification (ex: modification du contenu), par périodes de 24 heures
-ctime HEURES
En fonction de leur date de changement de statut (ex: modification des permissions)
$ touch file0
$ touch file1 -d "1 day ago"
$ touch file2 -d "2 days ago"
$ touch file3 -d "3 days ago"
# Les fichiers modifiés aujourd'hui
$ find . -type f -mtime 0
./file0
# Les fichiers modifiés il y a plus d'un jour
$ find . -type f -mtime +1
./file3
./file2
# Les fichiers crées aujourd'hui
$ find . -type f -ctime 0
./file3
./file1
./file0
./file2
-mmin MINUTES
et -cmin MINUTES
Même principe que -mtime et -ctime mais en minutes
find -mmin 5 # modified 5 minutes ago
find -mmin -5 # modified less than 5 minutes ago
find -mmin +5 # modified more than 5 minutes ago
-newerXY REF
Filtrer les fichiers suivant l’horodatage du fichier
# Les fichiers plus récents que file1
find . -newer file1
# Les fichiers qui n'ont pas été modifiés depuis $date (timestamp)
date="2016-01-18"
find . -type f -not -newermt "$date"
-size N
Filtrer les fichiers en fonction de leur taille
find -size 512k # 512 kb
find -size +512k # plus de 512 kb
find -size -512k # moins de 512 kb
find /lib64 -size +10M # plus de 10 M
-empty
pour filtrer sur les fichiers vides
find . -type d -empty -exec rmdir {} \;
-perm
permet de filtrer par permission
# exactement 664
$ find -perm 664
$ find -perm u=rw,g=rw,o=r
# 664 ou plus
$ find -perm -664
$ find -perm -u=rw,g=rw,o=r
# Un 4 à n'importe quelle position, ou 2 assigné à l'utilisateur ou groupe
$ find -perm /664
$ find -perm /u=rw,g=rw,o=r
# Les fichiers avec SUID ou SGID
$ sudo find /usr/*bin -perm /6000 -type f
/usr/bin/gpasswd
...
# Les fichiers avec SUID et SGID
$ sudo find /usr/*bin -perm -6000 -type f
/usr/bin/at
-executable
filtre sur les fichiers exécutables et les répertoires searchable par l’utilisateur en cours
# Les fichiers executables par l'utilisateur en cours
$ sudo find /usr/bin -executable
/usr/bin
...
-print -quit
pour s’arrêter au premier résultat
find ... -print -quit
-printf
pour modifier le format du résultat
$ find /tmp -name '*.txt'
/tmp/imap-ports.txt
/tmp/index.txt
$ find /tmp -name '*.txt' -printf '%p: %s\n'
/tmp/imap-ports.txt: 8
/tmp/index.txt: 325
$ find /tmp -name '*.txt' -printf '%P\n'
imap-ports.txt
index.txt
-user USERNAME
Fichiers qui appartiennent à l’utilisateur username
-group GROUPNAME
Fichiers qui appartiennent au groupe groupname
L’option -exec
de find permet d’effectuer une action sur chaque résultat de find (ligne par ligne)
L’option -exec doit se terminer par point-virgule (;
) pour marquer la fin du paramètre: le point-virgule ayant une signification en shell, il faut l’échapper d’un anti-slash (\
) pour qu’il soit interprété par la commande find et non par le shell.
find . -exec echo {}\;
exec ne peut exécuter qu’une seule commande, pour en exécuter plusieurs, créer un script temporaire avec sh -c
.
# Afficher le nom fichier puis son contenu
find . -exec sh -c "echo {} && cat {}" \;
-execdir
fonctionne de la même manière que exec, à la différence près que la commande sera executée dans le répertoire contenant le résultat et non dans le répertoire en cours:
$ mkdir dir
$ touch dir/file
$
$ find dir -type f -exec echo {} \;
dir/file
$
$ find dir -type f -execdir echo {} \;
./file
# Chercher le contenu du répertoire "dirname" et archiver les résultats un à un (tar.gz)
find dirname -execdir tar -cxf {}.tar.gz {} \;
-ok
fonctionne de la même manière que exec mais, à chaque résultat, demande la confirmation avant d’exécuter la commande (y = oui, tout autre caractère = non)
find dirname -ok rm {} \;