Использование Perl rename для переименования файлов и каталогов

Использование Perl rename для переименования файлов и каталогов

Я использую инструмент командной строки Perl rename для рекурсивного поиска по каталогу, чтобы переименовать любые каталоги, а также файлы, которые он найдет. Проблема, с которой я сталкиваюсь, заключается в том, что команда rename переименовывает подкаталог файла, а затем пытается переименовать родительский каталог того же файла. Это не сработает, поскольку подкаталог был переименован, что приводит к ошибке "Нет такого файла или каталога"

Команда:

rename -f 's/foo/bar/' **
rename -f 's/Foo/Bar/' **

Например, вот исходный файл, в котором я хотел бы заменить «foo» на «bar».

Файл:

/test/foo/com/test/foo/FooMain.java

Отказ:

Can't rename /test/foo/com/test/foo/FooMain.java /test/bar/com/test/foo/FooMain.java: No such file or directory

Предпочтительный файл:

/test/bar/com/test/bar/BarMain.java

Из сообщения об ошибке видно, что он пытается переименовать родительский каталог, но на тот момент подкаталог уже был изменен, что привело к ошибке «файл не найден». Есть ли параметры для команды переименования, которые исправят это, или мне нужно сделать это по-другому?

решение1

Я бы сделал это по-другому, а именно, используя поиск в глубину вместо оболочки globstar.**

Например, используя GNU find, учитывая:

$ tree
.
└── dir
    ├── foo
    │   └── baz
    │       └── MainFoo.c
    └── Foo
        ├── baz
        └── MainFoo.c

5 directories, 2 files

затем

find . -depth -iname '*foo*' -execdir rename -- 's/Foo/Bar/;s/foo/bar/' {} +

результаты в

$ tree
.
└── dir
    ├── bar
    │   └── baz
    │       └── MainBar.c
    └── Bar
        ├── baz
        └── MainBar.c

5 directories, 2 files

решение2

Как было отмечено ранее, вы спрашиваете о perl и показываете код на sh.

Если вы хотите использовать Perl 5

  • Модуль File::Find::Ruleпоможет вам найти поможет вам найти каталоги.
  • renameОстальную работу сделает Perl .

Связанный контент