Рекурсивное переименование папок и файлов в имя подкаталога и перемещение файлов
У меня есть несколько подкаталогов без единого шаблона именования в моем домашнем каталоге (например, ~/123
, ~/456
, ~/789
).
В каждом из этих подкаталогов у меня есть две папки с именем alignment1
а также alignment2
, В папках alignment1
а также alignment2
Есть несколько файлов.
Файлы, представляющие интерес для меня, названы alignment1
(без расширения) в alignment1
папка и файл alignment2
(без расширения) в alignment2
папка.
Пожалуйста, помните, что в папках alignment1
а также alignment2
есть другие файлы с именем alignment
, но у них есть расширения (например, alignment1.backbone
, alignment1.bbcol
а также alignment2.backbone
, alignment2.bbcol
в соответствующих alignment1
а также alignment2
папки), но я не заинтересован в этих файлах.
~/123/alignment1/alignment1
~/123/alignment2/alignment2
~/456/alignment1/alignment1
~/456/alignment2/alignment2
etc...
Вопрос:
Моя борьба состоит в том, чтобы переименовать папки
alignment1
а такжеalignment2
вsubdirectory_alignment1
а такжеsubdirectory_alignment2
(например,123_alignment1
а также123_alignment2
).Затем в папках
alignment1
а такжеalignment2
Выравнивание файлов, названныхalignment1
а такжеalignment2
соответственно, нужно переименовать вsubdirectory_1.aln
а такжеsubdirectory_2.aln
,Переместить
subdirectory_1.aln
а такжеsubdirectory_2.aln
в домашний каталог.
Я думаю, что это тесно связано с этим и с этим вопросом, но я пытался изменить ответы в вышеупомянутых сообщениях в течение последних нескольких часов безуспешно.
1 ответ
Попытка разбить проблему на мелкие части. Этот кусок кода должен найти все случаи. Возможно, вам следует что-то изменить в регулярном выражении. \1
будет соответствовать то, что уже соответствует внутри \(
а также \)
, mindepth
должен найти */*/*
и ниже. *
здесь важно из-за количества /
Вы будете иметь на результат.
find * -mindepth 2 -type f | grep '/\([a-z]*[0-9]\)/\1' | while read f; do
<process>
done
Теперь вы перебираете все интересующие вас файлы. echo "$f"
внутри цикла хорошая идея, прежде чем двигаться вперед.
Если фильтр работает, ниже приведены некоторые идеи разбить имя файла на маленькие части:
d1=`cut -d'/' -f1 <<< "$f"`
d2=`cut -d'/' -f2 <<< "$f"`
newName="${d1}/${d1}_${d2}"
Теперь просто несколько mv "$from" "$to"
здесь и там.