Find
De Bricosoft.
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 "2012-05-01" ! -newermt "2012-05-21"
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 + 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 :
$ 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
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"
| ||||||||||||||||||||||||||||||||



