Tengo esta estructura de carpetas:
├── foo1
│ ├── bar1.txt
│ └── bar2.txt
├── foo2
│ ├── bar3.txt
│ └── bar4 with a space.txt
└── foo3
└── qux1
├── bar5.txt
└── bar6.txt
que me gustaría aplanar en esto, con un guión bajo entre cada nivel de carpeta:
├── foo1_bar1.txt
├── foo1_bar2.txt
├── foo2_bar3.txt
├── foo2_bar4 with a space.txt
├── foo3_qux1.bar6.txt
└── foo3_qux1_bar5.txt
He buscado y no he encontrado ninguna solución que funcione, principalmente porque mi problema tiene dos particularidades: puede haber más de un nivel de carpeta dentro de la raíz y también porque algunos archivos pueden tener espacios.
¿Alguna idea de cómo lograr esto en bash? ¡Gracias!
Editar : Ejecutando la respuesta propuesta de Gleen Jackman, obtengo esto:
Hay dos guiones bajos para la carpeta de primer nivel. ¿Alguna idea de cómo evitar esto o simplemente renombrarlo para que sea solo un guión bajo? Gracias.
fuente
foo1__qux1_bar5.txt
, dos guiones bajos en el primer nivel de carpeta que es. Intenté jugar con tu línea de bash pero nada parecía funcionar. ¿Quizás necesito agregar algo?"${file//\//_}"
a"${file//+(/)/_
, y si esto es un guión,shopt -s extglob
brew install findutils
y luego usando engfind
lugar defind
. Esto funcionó para mí.Usando el cambio de nombre de perl:
SALIDA
NOTA
(?<!\.)
para no tocar el primero./
Mantengo los directorios vacíos, no dudes en:
find . -depth -type d -exec rm {} \;
Hay otras herramientas con el mismo nombre que pueden o no ser capaces de hacer esto, así que tenga cuidado.
Si ejecuta el siguiente comando (
GNU
)y tienes un resultado como
y no contiene:
entonces esta parece ser la herramienta correcta =)
Si no, para que sea el valor predeterminado (generalmente ya es el caso)
Debian
y derivado comoUbuntu
:(reemplazar
/path/to/rename
a la ruta de superl's rename
comando.Si no tiene este comando, busque su administrador de paquetes para instalarlo o hágalo manualmente
Por último, pero no menos importante, esta herramienta fue originalmente escrita por Larry Wall, el padre de Perl.
fuente
-type d -exec rmdir
...?perl-rename
en Arch Linux yprename
en sistemas basados en Debian.rename
Explicaciones agregadascon
pax
...Esto creará un enlace duro en el directorio actual a todos los archivos en sus directorios secundarios con una
_
sustituido por/
. Luego puede inspeccionar los resultados y eliminar todos los directorios secundarios con ...... una vez que haya verificado los resultados son de su agrado.
fuente
Puedes probar con el siguiente comando.
El comando anterior moverá los archivos y permanecerá el directorio que puede eliminarse más tarde.
fuente