Переименовывать файлы последовательно в двух отдельных папках

У меня есть две папки, папка A с 50 файлами и папка B с, скажем, N файлами, мне нужно сделать следующее: переименовать все файлы из обеих папок с общим счетчиком, каждый раз, когда я переименовываю файл из папки A, скажем, 1, 3 файла из папки B получит последовательный номер счетчика: 2, 3 и 4, а затем вернется к папке A и переименует следующий файл с 5, пока в папке A не останется файлов.

папкаA 1 5 9 13 17

папкаB 2 3 4 6 7 8 10 11 12 14 15 16 18 19 20

Есть предположения?


person darko    schedule 16.01.2014    source источник
comment
Это требует небольшого программирования. Вы знаете какие-нибудь языки программирования?   -  person Nate C-K    schedule 16.01.2014
comment
Я не программист, но я немного кодировал на C и некоторые Linux-скрипты, но ничего не касалось управления файлами в разных папках.   -  person darko    schedule 17.01.2014
comment
Это решение можно было бы реализовать на десятках языков, поэтому, если вы публикуете такой вопрос, лучше всего дать людям представление о том, какой язык вы хотите использовать. Идея этого сайта состоит в том, чтобы помочь вам учиться, поэтому он должен использовать технологию, с которой вы уже знакомы.   -  person Nate C-K    schedule 17.01.2014


Ответы (1)


Я думаю, что этот кусок кода сделает свое дело. Он основан на модульном увеличении номеров папок B и специальном условии остановки, если количество файлов в папке B более чем в 3 раза превышает количество файлов в папке A.

  • Шаблон FolderA — 1, 5, 9..., что похоже на инициализацию i равным 1 и увеличение на 4 для каждой итерации.
  • Имя FolderB увеличивается на 1, если i по модулю 4 не равно 0, иначе оно увеличивается на 2.

Если скопировать-вставить в файл (скажем, renaming.sh) и предполагая правильное разрешение на выполнение ($> chmod +x renames.sh), его можно использовать из командной строки следующим образом:

$> ./renaming.sh folderA folderB

Вот код, который нужно поместить в файл:

#!/bin/bash


i=1
ACOUNT=0
for FILEA in $1/*; do
        mv "${FILEA}" "$1/${i}"
        (( i+=4 ))
        ((ACOUNT++))
done

i=1
BCOUNT=0
for FILEB in $2/*; do
        if (( i%4 )) ; then
                ((i++))
        else
                ((i+=2))
        fi
        if ((BCOUNT>= 3* ACOUNT)); then break; fi
        ((BCOUNT++))

        mv "${FILEB}" "$2/${i}"
done
person Quirysse    schedule 16.01.2014
comment
Большое спасибо, мистер, я попробую. - person darko; 17.01.2014
comment
@дарко Нет проблем. Пожалуйста, отметьте свой вопрос как решенный, если он решит вашу проблему: другим будет легче найти хорошие ответы. И скажите мне, если это не так, мы постараемся разобраться. - person Quirysse; 17.01.2014