Estoy usando la herramienta de línea de comando de cambio de nombre de Perl para buscar recursivamente en un directorio y cambiar el nombre de los directorios y de los archivos que encuentre. El problema con el que me encuentro es que el comando cambiar nombre cambiará el nombre de un subdirectorio de un archivo y luego intentará cambiar el nombre del directorio principal del mismo archivo. Esto fallará porque se cambió el nombre del subdirectorio, lo que genera el mensaje "No existe tal archivo o directorio".
Dominio:
rename -f 's/foo/bar/' **
rename -f 's/Foo/Bar/' **
Por ejemplo, aquí hay un archivo original que me gustaría reemplazar 'foo' con 'bar'
Archivo:
/test/foo/com/test/foo/FooMain.java
Falla:
Can't rename /test/foo/com/test/foo/FooMain.java /test/bar/com/test/foo/FooMain.java: No such file or directory
Archivo preferido:
/test/bar/com/test/bar/BarMain.java
Puede ver en el mensaje de error que está intentando cambiar el nombre del directorio principal, pero en ese momento el subdirectorio ya se cambió, lo que genera el error de archivo no encontrado. ¿Existen parámetros para el comando de cambio de nombre que solucionen este problema o debo hacerlo de otra manera?
Respuesta1
Yo haría esto de una manera diferente, específicamente, usando una búsqueda en profundidad en lugar de Shell globstar.**
Por ejemplo, usando GNU find
, dado:
$ tree
.
└── dir
├── foo
│ └── baz
│ └── MainFoo.c
└── Foo
├── baz
└── MainFoo.c
5 directories, 2 files
entonces
find . -depth -iname '*foo*' -execdir rename -- 's/Foo/Bar/;s/foo/bar/' {} +
resultados en
$ tree
.
└── dir
├── bar
│ └── baz
│ └── MainBar.c
└── Bar
├── baz
└── MainBar.c
5 directories, 2 files
Respuesta2
Como se señaló anteriormente, está preguntando sobre Perl y mostrando el código en sh.
Si quieres usa Perl 5
- El módulo
File::Find::Rule
le ayudará a encontrar directorios. - Perl
rename
hará el resto del trabajo.