Я использую 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" вместо, "переименовывают" команду. Спасибо за любые предложения.
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
страница справочника.
Это найдет набор файлов рекурсивно и сделает a mv
переименовать их использование sed
обработать имена. Можно изменить спецификации файла и добавить Ваш sed
команда.
find . \( -name "1*.jpg" -o -name "1*.txt" \) -type f -exec sh -c mv "{}" "$(echo {} | sed '...')" \;