Я использую инструмент командной строки 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 .