it-swarm.com.de

rekursives Hinzufügen des Verzeichnisnamens zum Dateinamen

Angesichts der folgenden Struktur:

source/
  dir1/
   file1.ext1
   file2.ext2
  dir2/
   file3.ext3
    dir3/
     file4.ext4

Ich möchte folgendes erreichen:

destination/
 dir1file1.ext1
 dir1file2.ext2
 dir2file3.ext3
 dir3file4.ext4

Mit anderen Worten, ich möchte alle Dateien rekursiv von der Quelle zum Ziel verschieben und den Namen des ursprünglichen Unterverzeichnisses an den Dateinamen anhängen.

5
Catweasel

Verwenden von Perl umbenennen und 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)

Der reguläre Ausdruck (^|.*/)([^/]*)/([^/]*) speichert die letzten beiden Komponenten des Pfads (den Dateinamen und das übergeordnete Verzeichnis) als zweite und dritte übereinstimmende Gruppe.

Das Verzeichnis destination muss vorhanden sein, bevor dies ausgeführt werden kann. Der -n dient zum Testen, entfernen Sie ihn, um die Dateien tatsächlich zu verschieben.

5
muru