
Ich habe einen Verzeichnisbaum, in dem die Pfadelemente bestimmten Eigenschaften der Datei unter einem bestimmten Pfad entsprechen. Zum Beispiel so etwas:
$ tree
. ─ a ─ 1 ─ y ─ 334f
│ │ └── z ─ 6410
│ └── 2 ─ y ─ e776
└── b ─ 1 ─ y ─ 9828
└── 2 ─ y ─ 0149
└── z ─ 563a
Ich möchte die Reihenfolge der Pfadelemente ändern, sodass zuerst der Teil (x|y), dann (1|2) und dann (a|b) steht. ( ./a/1/y/334f
Sollte beispielsweise werden zu ./y/1/a/334f
.)
Der vollständige endgültige Baum sollte wie folgt aussehen:
$ tree
. ─ y ─ 1 ─ a ─ 334f
│ │ └── b ─ 9828
│ └── 2 ─ a ─ e776
│ └── b ─ 0149
└── z ─ 1 ─ a ─ 6410
└── 2 ─ b ─ 563a
Wie mache ich das?
Antwort1
Erstellen Sie die Zielverzeichnisse:
for d in */*/*;do mkdir -p $(echo $d | sed -r 's:(.+)/(.+)/(.+):\3/\2/\1/:'); done
Verschieben Sie die Dateien:
for d in */*/*;do mv $d/* $(echo $d | sed -r 's:(.+)/(.+)/(.+):\3/\2/\1/:'); done
(Diese Version beschwert sich, dass in den in Schritt 1 erstellten Verzeichnissen keine Dateien vorhanden sind. Sie können dies verbessern */*/*
oder die Zielverzeichnisse woanders erstellen.)