find -exec

By , 21/02/2011

Je ne sais jamais comment utiliser la commande Unix find pour exécuter une autre commande sur la base des fichiers trouvés. C’est une commande très pratique et puissante. Donc un échec se traduit forcément par une grande frustration.

En lisant l’explication du manuel (man find), je comprends rapidement le principe suivant : lorsqu’un fichier est trouvé, la commande suivant l’option -exec est exécutée. Il faut échapper les caractères spéciaux comme le point virgule de fin de commande pour éviter qu’ils ne soient interprétés par le shell lui même. Enfin, les caractères {} servent à utiliser le fichier trouvé par la commande find. Par exemple, voici comment déplacer tous les fichiers .txt d’un répertoire vers un autre :

Il y a trois fichiers txt et un fichier log dans le répertoire test. Le répertoire test2 est vide :

*@*:/home/*$ ll test
total 0
-rwxrwxrwx 1 root root 0 2011-02-20 23:28 txt1.log
-rwxrwxrwx 1 root root 0 2011-02-20 23:27 txt1.txt
-rwxrwxrwx 1 root root 0 2011-02-20 23:28 txt2.txt
-rwxrwxrwx 1 root root 0 2011-02-20 23:28 txt3.txt
*@*:/home/*$ ll test2/
total 0
*@*:/home/*$ find test/ -name *.txt
test/txt1.txt
test/txt2.txt
test/txt3.txt

Pour déplacer les fichiers txt du répertoire test vers le répertoire test2 on utilise la commande mv :

*@*:/home/*$ find test/ -name *.txt -exec mv {} test2/ ;

On vérifie l’opération :

*@*:/home/*$ ll test
total 0
-rwxrwxrwx 1 root root 0 2011-02-20 23:28 txt1.log
*@*:/home/*$ ll test2/
total 0
-rwxrwxrwx 1 root root 0 2011-02-20 23:27 txt1.txt
-rwxrwxrwx 1 root root 0 2011-02-20 23:28 txt2.txt
-rwxrwxrwx 1 root root 0 2011-02-20 23:28 txt3.txt

4 Responses to “find -exec”

  1. djib says:

    Intéressant ! J’avoue que j’ai tendance à passer par un fichier temporaire genre :
    ls test | grep .txt$ > temp
    mv `cat temp` test2
    rm temp
    Forcément c’est moins puissant et plus long.

    Merci pour l’astuce.

  2. Yan says:

    Ouai après il faut bien maitriser les fonctionnalités avancées de la commande find.
    Sinon, c’est super intéressant pour faire des traitements longs comme de l’encodage audio à la chaine.

  3. revo says:

    j’ai mis du temps aussi à trouver l’astuce de l’exec avec le find d’ailleurs des fois ça ne fonctionne pas bien.

    Une autre commande bien pratique est :
    grep -Rn “test” .
    ca fait une recherche dans les fichiers de manière récursive. Ce qui est pratique c’est que ca affiche le nom du fichier et le numéro de ligne.

  4. Yan says:

    En effet, l’option n’est pas simple à mettre en oeuvre. D’ailleurs je reviens souvent sur cette page pour me souvenir de son utilisation.
    Merci pour l’astuce sur le grep, c’est une commande que j’utilise beaucoup mais uniquement sur des cas simples.

Leave a Reply to djib


four × 6 =

OfficeFolders theme by Themocracy