Find

De bricosoft
Aller à la navigation Aller à la recherche
Fichier:Crystal Clear action find.png
L'allégorie de la paire de jumelles est souvent utilisée pour représenter la recherche de quelque chose
<google uid="C08" position="left"></google>
Erreur dans le widget Twitter Search: unable to write file /home/gbp4dt5/zones/bricosoft.com/www/extensions/Widgets/compiled_templates/wrt693d02a51ba7f6_62228155

find est une commande unix qui permet de trouver des trucs dans une arborescence.

recherche un fichier

Ca fichier de toujours rechercher un fichier dont on a oublié l'emplacement :

$ find /etc -name my.cnf 2>/dev/null
/etc/mysql/my.cnf

n'afficher que le chemin du fichier trouvé

find / -name my.cnf -printf '%h\n'

Voici un liste non exhaustive des directives % tirées du man :

%a     Date  du dernier accès au fichier, dans le format renvoyé
%b     Taille  de  l’espace  disque  consommé par le fichier, en nombre de blocs de 512 octets.
%c     Date de dernière modification du statut du fichier.
%d     Profondeur du  fichier  dans  l’arborescence.
%f     Nom du fichier, sans aucun  nom  de  répertoire
%F     Type  de  système  de  fichiers  sur  lequel se trouve le fichier.
%g     Nom  du groupe propriétaire du fichier, ou identifiant de groupe numérique si le groupe n’a pas de nom.
%G     Identifiant de groupe numérique du fichier.
%h     Dossier où se trouve le fichier
%H     Paramètre  de  la  ligne  de  commande à partir duquel le fichier a été trouvé.
%i     Numéro d’inode du fichier (en décimal).
%k     Taille du fichier, en nombre de blocs  de  1  kilo-octet.
%l     Destination du lien symbolique (vide si le fichier  n’est pas un lien symbolique).
%m     Bits  d’autorisation d’accès au fichier (en octal).
%M     Les  permissions du fichier (sous forme symbolique, comme dans ls).
%n     Nombre de liens physiques sur le fichier.
%p     Nom du fichier.
%P     Nom  du fichier, en retirant le nom du paramètre de ligne de commande à partir duquel le fichier a été trouvé.
%s     Taille du fichier en octets.
%t     Date  de dernière modification du fichier
%u     Nom  du  propriétaire du fichier, ou identifiant utilisateur numérique si l’utilisateur n’a pas de nom.
%U     Identifiant  utilisateur  numérique  du  propriétaire du fichier.
%y     Type  du  fichier (comme dans ls -l), U pour type inconnu
%Y     Type du fichier (comme pour %y), suivi,  pour  les  liens symbolique, de : L=boucle, N=inexistant.

retrouver des fichiers créés entre deux dates

En notation ISO YYYY-MM-DD (AAAA-MM-JJ pour les francophones) :

$ find . -type f -newermt "2025-12-01" ! -newermt "2025-12-13"

En anglais presque d'Oxford :

$ find photos/ -type f -newermt "2 years ago" ! -newermt "1 years ago"
./girlfriend-numero-124.jpg
$ find photos/ -type f -newermt "last friday"
./soiree-vendredi/cocktails-vodka.jpg
./soiree-vendredi/aux-baumettes.jpg

Par contre ça n'existe pas :

$ find photos/ -type f -newermt "last cuite"
find: Impossible d'interpréter "last cuite" comme une date ou une heure

Estimation de la place nécessaire avec filtre des fichiers

Ici, tous les fichiers de l'arbo qui ne sont pas des images jpeg :

$ find . -type f -not -iname '*.jpg' -ls |awk '{TOTAL+=$7} END {print int(TOTAL/(1024^2))" MB"}'
9 MB

On peut rajouter '-maxdepth n' pour les sous-dossiers.

L'équivalent avec du est :

$ du -hs --exclude=*.jpg

find -exec

Déplacer des musiques vers votre carte mémoire :

$ find . -name *.mp3 -exec cp {} /media/SD/ \;

Rechercher les images dans une arborescence en ignorant les vignettes puis les déplacer dans ~/all/ :

$ find . -type f -iregex ".*\(png\|svg|jpg|jpeg|gif|bmp|mp3\)$" ! -iname "thumb*" -exec mv {} ~/all/ \;

find + xargs == full of win!

<google uid="C06" position="left"></google>
Fichier:Epicwin-picard.jpg
find + xargs == full of win

Effacer certains fichier dans une arborescence

Vous trouvez la syntaxe -exec pas assez 1337 ? Cette commande effacera tous .old de l'arbo courante :

find . -name '*.old' | xargs rm

Pour faire quelque chose sur tous les liens (type l) du dossier (ici on efface) :

$ ls -l
drwxr-xr-x 2 brico brico 4096 2012-03-28 22:38 to
lrwxrwxrwx 1 brico brico    2 2012-03-28 22:38 toto -> to
$ find . -type l |xargs rm
$ ls -l
drwxr-xr-x 2 brico brico 4096 2012-03-28 22:38 to
$

Pour les dossiers le type est d

$ find . -type d |xargs rm

Liste des options habituelles :

  • -name Recherche par le nom de fichier : '*.png'
  • -type Recherche par le type de fichier :
    • d dossier
    • f fichier
    • l lien symbolique
    • il en existe d'autres moins courants (cf man find)
  • -user Recherche par le propriétaire : alfred (ou uid)
  • -group Recherche par l'appartenance à un groupe : metallica (ou gid)
  • -size Recherche par la taille de fichier : 3G (pour 3 Go, il y a aussi k, M, etc)
  • -atime Recherche par la date de dernier accès : +1 (accedé il y a au moins *2* jours), -1 (accès il y a moins d'un jour) ou 0 pour aujourd'hui
  • -mtime Recherche par la date de dernière modification : 3 (pour 3 jours, meme syntaxe que atime)
  • -ctime Recherche par date de création : 7 (pour 7 jours, idem atime)
  • -perm Recherche par les autorisations d'accès : -0777 ou /222 ou /u+w,g+w,o+w
  • -links Recherche par le nombre de liens au fichier : 2 (pour deux liens)

Rechercher une chaine précise dans certains fichiers d'une arbo

Cette commande retrouve les GLOBALS dans vos fichier .php :

$ find . -name '*.php' | xargs grep 'GLOBALS'
./resources/Resources.php:              'remoteBasePath' => $GLOBALS['wgStylePath'],
...
./includes/api/ApiQuerySiteinfo.php:            $data['server'] = $GLOBALS['wgServer'];
./includes/api/ApiQuerySiteinfo.php:            if ( $GLOBALS['wgMiserMode'] ) {

Total du nombre de lignes dans certains fichiers d'un répertoire

$ find . -name '*.php' | xargs wc -l
    128 ./img_auth.php
    292 ./skins/Standard.php
     13 ./skins/MySkin.deps.php
    459 ./skins/Vector.php
     13 ./skins/Chick.deps.php
     12 ./skins/Modern.deps.php
    404 ./skins/CologneBlue.php
     12 ./skins/MonoBook.deps.php
...
   1646 ./includes/Sanitizer.php
    139 ./includes/AjaxDispatcher.php
1171137 total

Rechercher puis effacer des fichiers avec des espaces

Certains fichiers ou dossiers possèdent des espaces et des antislashs, or xargs se sert de l'espace comme délimiteur d'arguments; l'option --null (ou -0) arrive alors à la rescousse :

Par exemple :

$ ls -1
belle doche 001.jpg
belle doche 002.jpg
...

Sans --null :

$ find . -name '*' -print0 | xargs echo
xargs: Attention : un caractère nul est arrivé en entrée. Il ne peut être ajouté à la liste d'arguments. Vouliez-vous en fait spécifier l'option --null ?
./belle doche 002.jpg doche 001.jpg

Avec --null :

$ find . -name 'belle\ doche*' -print0 | xargs --null echo
./belle doche 002.jpg ./belle doche 001.jpg [...]

Efface les tofs de la belle doche :

Fichier:Belle doche.gif
$ find . -name 'belle\ doche*' -print0 | xargs -0 rm

Et voilà plus aucune photo de la belle doche.

Rechercher puis déplacer/copier vers un emplacement

On passe le résultat de la recherche comme 1er paramètre de cp et copie tout ça dans /dev/null :

$ find . -name 'belle\ doche*' -print0 | xargs -0 -I % cp % /dev/null

% contient le résultat de la recherche. Vous pouvez utiliser un autre nom de variable que %, comme ici (PHOTOS_DE_LA_BELLE_DOCHE) :

$ find . -name 'belle\ doche*' -print0 | xargs -0 -I PHOTOS_DE_LA_BELLE_DOCHE cp PHOTOS_DE_LA_BELLE_DOCHE /

Recherche les doublons, triplons de fichiers / find duplicates files

La recherche de doublons a besoin de la signature du fichier (le hash md5) :

$ find -not -empty -type f -printf "%s\n" | sort -rn | uniq -d | xargs -I_DUPS_ -n1 find -type f -size _DUPS_c -print0 | xargs -0 md5sum | sort | uniq -w32 --all-repeated=separate
d85a148ea4bf70652036da5c3264eadc  ./P6192183.JPG
d85a148ea4bf70652036da5c3264eadc  ./pdzada.jpg

Décorticage :

find -not -empty -type f -printf "%s\n" : affiche la taille en octet des fichiers
sort -rn | uniq -d : trie numérique du plus grand au plus ptit puis n'affiche que la taille des dupliqués

xargs -I_DUPS_ -n1 find -type f -size _DUPS_c -print0 | xargs -0 md5sum : calcule le MD5 de chaque fichier

sort | uniq -w32 --all-repeated=separate : trie puis ne garde que les MD5 différents(32 caractères) affiché séparément 

source : [1]

clicodrome, GUI

Il existe une GUI pour rechercher les doublons de fichier

$ sudo apt-get install fslint
$ sudo yum install fslint

find + while

La plupart des commandes avec find et xargs sont transposables avec find + while + read.

Exemple idiot, changer l'extension de fichier .new en .old :

$ ls
a.new  b.old  c.new
$ find . -name "*.new"|while read img;do mv $img "${img%.*}".old;done
$ ls
a.old  b.old  c.old

Remarques :

${img%.*} : renvoi le nom du fichier sans l'extension
${img##*.} : renvoi que l'extension

Rechercher tout sauf un truc

Recherchez tous les fichiers sauf les .txt :

$ find . ! -name "*.txt"

Avant de partir

N'oubliez pas d'améliorer les performances ou d'adoucir le processus avec un renice pour les entrées/sorties (grace à ionice) sinon ça tue des chatons :

ionice -c3 find . |grep "\.js"

{{#switch:|subgroup|child=|none=|#default=

}}

Liens

Erreur dans le widget DISQUS: Unable to load template 'wiki:DISQUS'