2

Я использую Windows и пытаюсь использовать Cygwin для выполнения этой задачи. Я хотел бы рекурсивно переименовать файлы и каталоги следующим образом:
От:
1010110010\
1010110010\ 1010110010.jpg
1010110010\ 1010110010.txt
1010110020\
1010110020\ 1010110020.jpg
1010110020\ 1010110020.txt
...

чтобы:
1-01-01-1-001-0\
1-01-01-1-001-0\ 1-01-01-1-001-0.jpg
1-01-01-1-001-0\ 1-01-01-1-001-0.txt
1-01-01-1-002-0\
1-01-01-1-002-0\ 1-01-01-1-002-0.jpg
1-01-01-1-002-0\ 1-01-01-1-002-0.txt
...

Я думал об использовании цикла for, но цикл for не смог рекурсивно пройти по каталогам. Я могу использовать только для и sed, чтобы переименовать список файлов в каталоге:

for i in *; do j=`echo $i | sed 's/\(.\)\(..\)\(..\)\(.\)\(...\)\(.\)/\1-\2-\3-\4-\5-\6/g'`; mv $i $j; done

Но я хотел бы переименовать несколько каталогов и файлов внутри. Итак, я попытался найти "find", но я не знаю, как использовать переменные и регулярные выражения с командой "find". Кроме того, поскольку я использую Cygwin, я могу использовать только команду "mv" вместо команды "rename". Спасибо за любые предложения.

3 ответа3

0

Unix имеет несколько мощных способов переименования файлов. Вот тот, который использует zsh (убедитесь, что он установлен). Это сначала переименовывает каталоги, затем переименовывает файлы в каталогах.

autoload zmv
zmv -o -i '(?)(??)(??)(?)(???)(?)' '$1-$2-$3-$4-$5-$6'
zmv -o -i '(*)/(?)(??)(??)(?)(???)(?).(*)' '$1/$2-$3-$4-$5-$6-$7.$8'

Из вашего вопроса не ясно, могут ли каталоги вкладываться. Если они это сделают, вот одна команда, которая заботится как о каталогах, так и о файлах, используя тот факт, что одна замена шаблона работает для обоих:

zmv -o -i '(**/)(?)(??)(??)(?)(???)(*)' '$1$2-$3-$4-$5-$6-$7$8'

Если вы передадите опцию -n в zmv , она покажет, что команда сделала бы без фактического перемещения файлов. Я использую -o -i в моем примере, чтобы он запрашивал подтверждение, если он перезапишет файл, и выполняет молча в противном случае.

zmv описан на странице руководства zshcontrib .

0

Это найдет кучу файлов рекурсивно и сделает mv чтобы переименовать их, используя sed для обработки имен. Вы можете изменить спецификации файлов и добавить команду sed .

find . \( -name "1*.jpg" -o -name "1*.txt" \) -type f -exec sh -c mv "{}" "$(echo {} | sed '...')" \;
0

File::Rename или скрипт prename Debian, оба в Perl.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .