
У меня есть дерево каталогов, где элементы пути соответствуют определенным свойствам файла по определенному пути. Например, что-то вроде этого:
$ 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; вы можете исправить это */*/*
или создать целевые каталоги в другом месте)