重新排序目录树的路径元素

重新排序目录树的路径元素

我有一个目录树,其中路径元素对应于特定路径处文件的特定属性。例如,这样的事情:

$ 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中创建的目录中没有文件,您可以改进*/*/*或在其他地方创建目标目录)

相关内容