Как просмотреть все подпапки и переименовать все папки с именем «Старые» в «Новые»
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", включая несколько вхождений в пределах одного имени.