Usando Perl rename para cambiar el nombre de archivos y directorios

Usando Perl rename para cambiar el nombre de archivos y directorios

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::Rulele ayudará a encontrar directorios.
  • Perl renamehará el resto del trabajo.

información relacionada