Рекурсивное переименование папок и файлов в имя подкаталога и перемещение файлов

У меня есть несколько подкаталогов без единого шаблона именования в моем домашнем каталоге (например, ~/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...

Вопрос:

  1. Моя борьба состоит в том, чтобы переименовать папки alignment1 а также alignment2 в subdirectory_alignment1 а также subdirectory_alignment2 (например, 123_alignment1 а также 123_alignment2).

  2. Затем в папках alignment1 а также alignment2Выравнивание файлов, названных alignment1 а также alignment2 соответственно, нужно переименовать в subdirectory_1.aln а также subdirectory_2.aln,

  3. Переместить 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" здесь и там.

Другие вопросы по тегам