Aller au contenu

find

(Voir aussi fd)

La commande find permet de retrouver des fichiers à partir de certains critères. Elle doit être utilisé avec l'option -print

Les critères de recherche sont les suivants :

  • -name recherche sur le nom du fichier,
  • -perm recherche sur les droits d'accès du fichier,
  • -links recherche sur le nombre de liens du fichier,
  • -user recherche sur le propriétaire du fichier,
  • -group recherche sur le groupe auquel appartient le fichier,
  • -type recherche sur le type (d=répertoire, c=caractère, f=fichier normal),
  • -size recherche sur la taille du fichier en nombre de blocs (1 bloc=512octets),
  • -atime recherche par date de dernier accès en lecture du fichier,
  • -mtime recherche par date de dernière modification du fichier,
  • -ctime recherche par date de création du fichier.

Options:

Nom:

Recherche par nom (-name) (sensible à la case):

# Le nom exact: toto

$ find /usr -name toto -print

# Le nom contient: Casa

$ find /usr -name "*Casa*"

# L'extension est .c

$ find /usr -name " *.c " -print

# commence par un a ou A, suivi de quelque chose, et se termine par un chiffre compris entre 3 et 6

$ find . -name '[aA]*[3-6]' -print

Recherche par nom (-iname) (non sensible à la case):

# Le nom exact: toto

$ find /usr -iname toto -print

Cela renvoie à la fois des fichiers et des dossiers. Pour avoir le choix fichiers ou dossiers (-type):

# Pour les fichiers uniquement

$ find /usr -name toto -type f

# Pour les dossiers uniquement

$ find /usr -name toto -type d

Ne pas afficher les fichiers ou dossiers invisibles:

$find -not -path '*/\.*'

$find . -type f | grep -v '/\.'

Taille:

Recherche suivant la taille (-size):

  • c: octet
  • k: kilo
  • M: méga
  • G: giga
# fichiers de 30ko

$ find / -size 30k -print

# fichiers dont la taille dépasse 30ko

$ find / -size +30k -print

# fichiers dont la taille est comprise entre 30 et 100ko

$ find / -size +30k -size -100k

# fichiers de moins de 30ko

$ find / -size -30k -print


# répertoire de plus de 30k

$ find / -type d -size +30k -print
# fichier ou répertoire vide

$ find / -size 0
$ find / -empty

find / -type d -empty

Opérateurs logiques:

Recherche en utilisant les opérateurs logiques:

# Recherche les fichiers n'appartenant pas à l'utilisateur olivier.

$ find . ! -user olivier -print

# Recherche les fichiers dont le nom est a.out ou les fichiers se terminant par *.c (une condition OU l'autre).

$ find . \  ( -name a.out -o -name " *.c " \  ) -print

# Recherche les fichiers dont l'extension est .pdf, .txt ou .doc

$ find . -type f ( -name "*.txt" -o -name "*.pdf" -o -name "*.doc" )

# Recherche des fichiers dont le nom est core et d'une taille supérieure à 1Mo (une condition ET l'autre).

$ find . \  (-name core -a size +2000 \  ) -print

Date:

Rechercher le plus vieux fichier:

$ find / -type f -printf '%T+ %p\n' | sort | head -n 1

Recherche suivant la date de dernière modification (-mtime):

# modifiés il y a 30 jours

$ find / -mtime 30 -print

# modifiés il y a 30 jours ou plus

$ find / -mtime +30 -print

# modifiés il y a 30 jours ou moins

$ find / -mtime 30 -print

# modifiés il y a plus de 50 jours et moins de 100

$ find / -mtime +50 –mtime -100

# modifiés dans la dernière heure

$ find / -mmin -60

# accédées dans la dernière heure

$ find / -amin -60
$ find . -mtime +0 # find files modified greater than 24 hours ago
$ find . -mtime 0 # find files modified between now and 1 day ago (i.e., in the past 24 hours only)
$ find . -mtime -1 # find files modified less than 1 day ago (SAME AS -mtime 0)
$ find . -mtime 1 # find files modified between 24 and 48 hours ago
$ find . -mtime +1 # find files modified more than 48 hours ago

Permissions:

Rechercher des permissions:

$ find /volume1/@appstore/PHP7.4/etc -perm 644
/volume1/@appstore/PHP7.4/etc/php/conf.d/memcached.ini
/volume1/@appstore/PHP7.4/etc/php/conf.d/redis.ini

$ ls -la
-rw-r--r--    1 root     root            25 Sep 14 13:39 memcached.ini
-rw-r--r--    1 root     root            21 Sep 14 13:39 redis.ini

Inverser la recherche (!):

$ find /volume1/@appstore/PHP7.4/etc ! -perm 644
/volume1/@appstore/PHP7.4/etc
/volume1/@appstore/PHP7.4/etc/php
/volume1/@appstore/PHP7.4/etc/php/conf.d

Rechercher les fichiers avec permission 777 et les modifiés en 644:

$ find / -type f -perm 0777 -print -exec chmod 644 {} \;

# idem pour les dossiers
$ find / -type d -perm 777 -print -exec chmod 755 {} \;

Recherche combinée:

# les fichiers de l'utilisateur bruno dont les permissions sont 755

$ find / -type f -user bruno -perm 755 -print

Rechercher les exécutables:

$ find /var/services/homes/bruno -perm /a=x

Rechercher les fichiers en lecture seule:

$ find /var/services/homes/bruno -perm /u=r

Regex:

Recherche avec regex:

# les images avec extentions jpg|gif|png|jpeg dans le dossier Users
# -E => macOS only ??

$ find -E /Users/bruno -regex ".*\.(jpg|gif|png|jpeg)"
$ find -E $HOME/Music -regex ".*\.(mp3|flac)"

# non case-sensitive
$ find -E /Users/bruno -iregex ".*\.(jpg|gif|png|jpeg)"

# Linux / GNU find (macOS)
$ find $HOME/Music -regex ".*\.\(mp3\|flac\)"
$ gfind $HOME/Music -regex ".*\.\(mp3\|flac\)"

User / group:

$ find /home -user bruno

$ find /home -group http

Commandes en option:

# Recherche les fichiers toto et les efface.

$ find . -name toto -exec rm {}\   ;

# Pour avoir une demande de confirmation avant l'exécution de rm

$ find . -name toto -ok rm {}\   ;

Utilisation avec d'autres commandes:'

# Recherche les fichiers normaux dans le répertoire courant, puis chercher le chaine toto dans ces fichiers.

$ find . -type f -print | xargs grep toto

# Recherche les fichiers toto et les efface après confimation (-p).
# idem -exec, " | xargs " ne crée qu'un seim processus.

$ find . -name toto  | xargs -p rm

Effacer tous les fichiers d'un dossier sauf un:

$ find . -type f ! -name 'fichier-a-garder.tar.gz' -delete

Présentation de la sortie:

l'option -ls correspond à un 'ls -dils'

$ find /var/services/homes/bruno -name "*php*.ini" -ls
    56408     72 -rwxrwxrwx   1 bruno    users       72040 Nov 10  2017 /var/services/homes/bruno/Drive/Drive/Apache\ -\ PHP/Backup\ Silverbook/php.ini
   364193      8 -rw-r--r--   1 root     root         8169 Nov 13 10:53 /var/services/homes/bruno/php74.ini
   364195      8 -rw-r--r--   1 root     root         8145 Nov 13 10:55 /var/services/homes/bruno/php73.ini

printf

affiche le format indiqué sur la sortie standard

# taille en octet - nom
$ find /var/services/homes/bruno -name "*php*.ini" -printf '%s %p\n'
72040 /var/services/homes/bruno/Drive/Drive/Apache - PHP/Backup Silverbook/php.ini
8169 /var/services/homes/bruno/php74.ini
8145 /var/services/homes/bruno/php73.ini

# date - bits - user:group - taille en octet - nom
$ find /var/services/homes/bruno -name "*php*.ini" -printf "%t %M %u:%g %s %p\n"
Fri Nov 10 09:10:42.0000000000 2017 -rwxrwxrwx bruno:users 72040  9 /var/services/homes/bruno/Drive/Drive/Apache - PHP/Backup Silverbook/php.ini
Fri Nov 13 10:53:58.5922529060 2020 -rw-r--r-- root:root 8169 10 /var/services/homes/bruno/php74.ini
Fri Nov 13 10:55:50.7925348300 2020 -rw-r--r-- root:root 8145 10 /var/services/homes/bruno/php73.ini
%u Nom du propriétaire du fichier
%g Nom du groupe propriétaire du fichier
%s Taille du fichier en octets
%k Taille du fichier en ko
%p Nom du fichier
%t Date de dernière modification du fichier
%Tk Date de dernière modification du fichier
%m Bits d'autorisation d'accès au fichier (en octal)(644/755)
%M Bits d'autorisation d'accès au fichier (symbole)(-rw-r--r--)

fprintf fichier format

écrit le nom complet dans le fichier. Si fichier n'existe pas au démarrage de find, il est créé. S'il existe, il est écrasé.

Redirection des messages d'erreur:

$ find /volume1/@appstore/ -name "*php*.ini"
/volume1/@appstore/PHP7.0/usr/local/etc/php70/php.ini
find: ‘/volume1/@appstore/DNSServer/named/etc/key’: Permission denied
find: ‘/volume1/@appstore/DNSServer/named/usr/lib/ocf/lib’: Permission denied
find: ‘/volume1/@appstore/DNSServer/named/usr/lib/ocf/resource.d’: Permission denied
find: ‘/volume1/@appstore/DNSServer/named/usr/lib/heartbeat/plugins’: Permission denied
/volume1/@appstore/PHP7.2/misc/php-fpm.ini
/volume1/@appstore/PHP7.2/usr/local/etc/php72/cli/php.ini
find: ‘/volume1/@appstore/Gitea/gitea/data’: Permission denied
find: ‘/volume1/@appstore/Gitea/gitea/.ssh’: Permission denied
/volume1/@appstore/PHP7.3/misc/php-fpm.ini
/volume1/@appstore/PHP7.3/usr/local/etc/php73/cli/php.ini
/volume1/@appstore/WebStation/misc/php56.ini
/volume1/@appstore/WebStation/misc/php70.ini
/volume1/@appstore/phpMyAdmin/php_conf/phpMyAdmin.ini
/volume1/@appstore/PHP7.4/misc/php-fpm.ini
/volume1/@appstore/PHP7.4/usr/local/etc/php74/cli/php.ini
Tous les messages d'erreurs sont redirigés avec 2>/dev/null vers la poubelle.
$ find / -name site-packages -type d  -print 2>/dev/null


$ find /volume1/@appstore/ -name "*php*.ini" 2>/dev/null
/volume1/@appstore/PHP7.0/usr/local/etc/php70/php.ini
/volume1/@appstore/PHP7.2/misc/php-fpm.ini
/volume1/@appstore/PHP7.2/usr/local/etc/php72/cli/php.ini
/volume1/@appstore/PHP7.3/misc/php-fpm.ini
/volume1/@appstore/PHP7.3/usr/local/etc/php73/cli/php.ini
/volume1/@appstore/WebStation/misc/php56.ini
/volume1/@appstore/WebStation/misc/php70.ini
/volume1/@appstore/phpMyAdmin/php_conf/phpMyAdmin.ini
/volume1/@appstore/PHP7.4/misc/php-fpm.ini
/volume1/@appstore/PHP7.4/usr/local/etc/php74/cli/php.ini

C'est un peu plus propre.

Autre solution avec grep -v "Permission denied", les autres messages d'erreurs restent affichés.

$ find / -name "*php*.ini" 2>&1 | grep -v "Permission denied"
/etc/php/php.ini
/volume1/@appstore/PHP7.0/usr/local/etc/php70/php.ini
/volume1/@appstore/PHP7.2/misc/php-fpm.ini
/volume1/@appstore/PHP7.2/usr/local/etc/php72/cli/php.ini
/volume1/@appstore/PHP7.3/misc/php-fpm.ini
/volume1/@appstore/PHP7.3/usr/local/etc/php73/cli/php.ini
/volume1/@appstore/WebStation/misc/php56.ini
/volume1/@appstore/WebStation/misc/php70.ini
/volume1/@appstore/phpMyAdmin/php_conf/phpMyAdmin.ini
/volume1/@appstore/PHP7.4/misc/php-fpm.ini
/volume1/@appstore/PHP7.4/usr/local/etc/php74/cli/php.ini
...
/volume1/@Entware/opt/etc/php.ini
/volume1/docker/piwigo/config/php/php-local.ini
/etc.defaults/php/php.ini
/opt/etc/php.ini
/usr/syno/etc/packages/WebStation/php70/php.ini
/usr/syno/etc/packages/WebStation/php56/php.ini
/usr/local/etc/php70/php.ini
/usr/local/etc/php73/cli/php.ini
/usr/local/etc/php74/cli/php.ini
/usr/local/etc/php72/cli/php.ini
/usr/local/etc/php72/cli/conf.d/phpMyAdmin.ini
find: ‘/proc/24000/net’: Invalid argument

Dernière mise à jour: March 4, 2022