1

Как просмотреть все подпапки и переименовать все папки с именем «Старые» в «Новые»

2 ответа2

1

Если у вас есть 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.

1

Что-то вроде этого:

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

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