2016-01-29 12 views
0

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

Я думаю, что она тесно связана с this и this вопроса, но я пытался изменить ответы в указанных почтовых отправлениях за последние несколько часов без успеха.

ответ

0

Попытка разбить проблему на мелкие детали. Этот фрагмент кода должен найти все вхождения. Возможно, вы должны что-то изменить в регулярном выражении. \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" здесь и там.

+0

Большое спасибо за быстрый ответ JoaoMorais! – Abi

+0

Извините, но код, похоже, не работает для меня. Я попытался использовать эхо «$ f», но совпадений не найдено. Я думаю, что даже найти не найти файлы -: .. Я знаю, что я не могу помочь здесь, так как нет сообщения об ошибке, чтобы относиться к нему. Все мысли? – Abi

+0

@Abi Попробуйте найти * -mindepth 2-type f (из корневого каталога вашего поиска), упростите grep. Трюк здесь состоит в том, чтобы построить ваш сценарий по одной части за раз. –