Как просмотреть все подпапки и переименовать все папки с именем «Старые» в «Новые»
2 ответа
Если у вас есть zsh:
autoload zmv
zmv -QW '**/Old(/)' '**/New'
zmv -W '**/Old' '**/New'
Здесь autoload zmv загружает скрипт zmv который поставляется вместе с zsh; zmv -W pattern replacement означает «для каждого совпадения запомните значение всех символов подстановки в pattern и замените соответствующие символы подстановки при replacement этим значением»; zmv -Q означает «разрешить глобальные квалификаторы в шаблоне»; '**/Old' означает «сопрягать все файлы с именем«Старый»в дереве под текущей директории» и (/) Glob классификатор ограничивает «все файлы» , чтобы быть только каталоги. Другие полезные опции zmv :
-n: ничего не делать, просто распечатать, что будет сделано.-i: показать каждую строку для выполнения и спросить, выполнять ли ее-f: принудительно перезаписать файлы назначения
Если вы предпочитаете [ba] sh:
RnAll() { for f in "$1"/* ; do [ -d "$f" ] || continue ; ( RnAll "$f" "$2" "$3" ) ; [ "`basename $f`" \== "$2" ] && mv "$f" "`dirname $f`/$3" ; done }
RnAll . Old New
Это почти чистое решение sh (или, по крайней мере, bash), которое не требует ничего, кроме shell и coreutils.
Что-то вроде этого:
find . -type d -exec rename <rename options> \;
Параметры переименования будут различаться в зависимости от того, какое rename вас есть. В переименовании Red Hat используется rename Old New {} , тогда как в системах Debian/Ubuntu часто используется переименование Perl, которое использует следующий синтаксис:
rename 's/^Old$/New/' {}
Это только изменит точные совпадения для "Old"; используйте s/Old/New/g если вы хотите изменить все вхождения "Old" на "New", включая несколько вхождений в пределах одного имени.
