ディレクトリツリーのパス要素を並べ替える

ディレクトリツリーのパス要素を並べ替える

パス要素が特定のパスにあるファイルの特定のプロパティに対応するディレクトリ ツリーがあります。たとえば、次のようになります。

$ 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 で作成されたディレクトリにファイルが存在しないというエラーが表示されますが、これを改善する*/*/*か、別の場所にターゲット ディレクトリを作成できます)

関連情報