
Mi árbol de directorios es como el siguiente:
/media/blueray/Data/Test$ tree
.
├── What????
│ └── What????
└── What????.txt
Cuando ejecuto el comandofind . -depth | rename 's/[?<>\\:*|\"]//g'
Dice -
Can't rename ./What????/What???? ./What/What: No such file or directory
Sin embargo, después de ejecutar el comando, la estructura del directorio se convierte en:
/media/blueray/Data/Test$ tree
.
├── What
│ └── What????
└── What.txt
Me parece que find
está empezando a buscar desde lo alto del árbol, por lo que está perdiendo el rastro del árbol.
¿Cuál es la solución aquí?
Respuesta1
El problema no es causado por find
, sino por rename
: está procesando la ruta completa, por lo que intenta cambiar el nombre ./What????/What????
a ./What/What
, lo cual falla porque el What
directorio no existe (todavía).
Llegar rename
a procesar nombres de archivos únicamente, con -d
, solucionará este problema:
find . -depth | rename -d 's/[?<>\\:*|\"]//g'
Si su versión de rename
no admite la -d
opción (introducida con la versión 1.10 de File::Rename
, suponiendo que rename
sea la versión de Perl), puede find
pasar los nombres de archivos solo ejecutando rename
dentro de cada directorio:
find . -depth -execdir rename 's/[?<>\\:*|\"]//g' {} +
(Gracias aFreddyparala solución.)