重新排序目錄樹的路徑元素

重新排序目錄樹的路徑元素

我有一個目錄樹,其中路徑元素對應於特定路徑處文件的特定屬性。例如,這樣的事情:

$ tree 
. ─ a ─ 1 ─ y ─ 334f
│   │   └── z ─ 6410
│   └── 2 ─ y ─ e776
└── b ─ 1 ─ y ─ 9828
    └── 2 ─ y ─ 0149
        └── z ─ 563a

我想更改路徑元素的順序,將 (x|y) 部分放在前面,然後是 (1|2),然後是 (a|b)。 (例如,./a/1/y/334f應變為./y/1/a/334f。)

完整的最終樹應該是:

$ tree
. ─ y ─ 1 ─ a ─ 334f
│   │   └── b ─ 9828
│   └── 2 ─ a ─ e776
│       └── b ─ 0149
└── z ─ 1 ─ a ─ 6410
    └── 2 ─ b ─ 563a

我該怎麼做呢?

答案1

建立目標目錄:

for d in */*/*;do mkdir -p $(echo $d | sed -r 's:(.+)/(.+)/(.+):\3/\2/\1/:'); done

移動文件:

for d in */*/*;do mv $d/* $(echo $d | sed -r 's:(.+)/(.+)/(.+):\3/\2/\1/:'); done

(這個版本會抱怨步驟#1中建立的目錄中沒有文件,您可以改進*/*/*或在其他地方建立目標目錄)

相關內容