Pfadelemente eines Verzeichnisbaums neu anordnen

Pfadelemente eines Verzeichnisbaums neu anordnen

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/334fSollte 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.)

verwandte Informationen