web-dev-qa-db-fra.com

ajouter récursivement le nom du répertoire au nom du fichier

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.

5
Catweasel

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.

5
muru