Изменение порядка элементов пути в дереве каталогов

Изменение порядка элементов пути в дереве каталогов

У меня есть дерево каталогов, где элементы пути соответствуют определенным свойствам файла по определенному пути. Например, что-то вроде этого:

$ 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; вы можете исправить это */*/*или создать целевые каталоги в другом месте)

Связанный контент