La procédure suivante déplace tous les fichiers HTML hors du répertoire foo
et supprime les répertoires vides :
$ find foo -name '*.html' -type f -exec mv -nv "{}" '.' \;
foo/bar/1.html -> ./1.html
./1.html not overwritten
foo/baz/qux/3.html -> ./3.html
foo/baz/qux/5.html -> ./5.html
$ find foo -depth -type d -delete
Il reste des fichiers HTML avec des noms de fichiers contradictoires, des fichiers qui ne sont pas des fichiers HTML et des dossiers non vides.
Pour renommer automatiquement les fichiers afin d'éviter les noms de fichiers en double, vous pouvez utiliser l'option mktemp
. La syntaxe est différente d'un système d'exploitation à l'autre, et la syntaxe ci-dessous fonctionne sous OS X et vraisemblablement sous les BSD :
find foo -name '*.html' -type f -exec bash -c 'mv -v "$0" "./$( mktemp "$( basename "$0" ).XXX" )"' '{}' \;
foo/bar/1.html -> ./1.html.yNr
foo/baz/1.html -> ./1.html.RUu
foo/baz/qux/3.html -> ./3.html.rzu
foo/baz/qux/5.html -> ./5.html.JyW
Pour chaque fichier HTML qu'il trouve, il lance bash et lui fait exécuter la commande suivante -c
qui n'est en fait qu'un mv
avec un fichier créé dynamiquement (à l'aide de mktemp
) le nom du fichier de destination dans le répertoire actuel.
Pour vous assurer qu'il fonctionnera comme prévu, vous pouvez echo
les mv
d'abord en guise d'aperçu :
find foo -name '*.html' -type f -exec bash -c 'echo mv -v "$0" "./$( mktemp "$( basename "$0" ).XXX" )"' '{}' \;
mv -v foo/bar/1.html ./1.html.VNf
mv -v foo/baz/1.html ./1.html.pCW
mv -v foo/baz/qux/3.html ./3.html.ADN
mv -v foo/baz/qux/5.html ./5.html.K3w
Comme vous pouvez le voir, chaque invocation donne lieu à un suffixe différent grâce à mktemp
で、その bash
script (vous ne pouvez pas inclure cette partie dans un fichier de type -exec mv
car il serait évalué une fois pour le find
et utiliser le même suffixe pour toutes les personnes déplacées).
En fonction du nombre de fichiers concernés, vous pouvez avoir besoin d'un suffixe aléatoire plus important que le simple .XXX
.