Как использовать cygwin (или команда Linux) для переименования файлов и каталогов рекурсивно с регулярным выражением

Я использую 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
...

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

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

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

2
задан 23.10.2014, 18:42

3 ответа

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
ответ дан 12.12.2019, 07:09

File::Rename или Debian prename сценарий, оба в Perl.

0
ответ дан 12.12.2019, 07:09

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

find . \( -name "1*.jpg" -o -name "1*.txt" \) -type f -exec sh -c mv "{}" "$(echo {} | sed '...')" \;
0
ответ дан 12.12.2019, 07:09

Теги

Похожие вопросы