Compte tenu de la structure suivante:
source/
dir1/
file1.ext1
file2.ext2
dir2/
file3.ext3
dir3/
file4.ext4
Je veux atteindre les objectifs suivants:
destination/
dir1file1.ext1
dir1file2.ext2
dir2file3.ext3
dir3file4.ext4
En d'autres termes, je souhaite déplacer tous les fichiers, de manière récursive, de la source à la destination, en ajoutant le nom d'origine du sous-répertoire au nom du fichier.
Avec Perl, renommez et find
:
$ find source -type f | rename -n 's:(^|.*/)([^/]*)/([^/]*)$:destination/$2$3:'
rename(source/dir2/file3.ext3, destination/dir2file3.ext3)
rename(source/dir2/dir3/file4.ext4, destination/dir3file4.ext4)
rename(source/dir1/file1.ext1, destination/dir1file1.ext1)
rename(source/dir1/file2.ext2, destination/dir1file2.ext2)
La regex (^|.*/)([^/]*)/([^/]*)
enregistre les deux derniers composants du chemin (le nom du fichier et le répertoire parent) en tant que deuxième et troisième groupes correspondants.
Le répertoire destination
doit exister avant de l'exécuter. Le -n
est destiné aux tests, supprimez-le pour déplacer réellement les fichiers.