El bucle de una sola línea de bash sobre directorios arroja errores

El bucle de una sola línea de bash sobre directorios arroja errores

Estoy intentando crear un resumen bash para recorrer los directorios dentro del directorio actual y tar el contenido en archivos tar únicos, usando el nombre del directorio como nombre del archivo tar. Tengo lo básico funcionando (buscar los nombres de los directorios y agregarlos con esos nombres), pero mi bucle arroja algunos mensajes de error y no puedo entender de dónde obtienen los comandos que intenta ejecutar.

Aquí está la frase que mayormente funciona:

for f in `ls -d */`; do `tar -czvvf ${f%/}.tar.gz $f`;done

La salida "extraña" es:

-bash: drwxrwxr-x: command not found
-bash: drwxr-xr-x: command not found
-bash: drwxr-xr-x: command not found
-bash: drwxrwxr-x: command not found

¿Qué parte del comando que estoy ejecutando no entiendo y que genera ese resultado?

Respuesta1

Debes eliminar los backtics alrededor de tu tarcomando. También es posible que desees canalizar el lsenlace xargspara asegurarte de que bash recoja todos los directorios correctamente:

for f in `ls -d */ | xargs`; do tar -cvzf ${f%/}.tar.gz $f; done

Las comillas invertidas capturan la salida tare intentan ejecutarla como un comando en cada iteración del bucle. Lo primero que tarse imprime cuando usa la opción -v son los permisos de cada archivo (por ejemplo, el drwxrwxr-x). En este caso, desea que bashejecutarel comando tar, no capturar la salida.

Respuesta2

bjlaubes correcto con respecto a las comillas invertidas tar, sin embargo, no es necesario usar ls:

for file in */

funcionará y manejará adecuadamente los nombres de directorio con espacios.

Respuesta3

Las otras respuestas aquí son buenas, pero quería agregar otra opción en caso de que necesite obtener solo directorios y no enlaces simbólicos, etc.

for f in `find -maxdepth 1 -type d` | do -cvzf ${f%/}.tar.gz $f; done 

¡Espero que esto ayude!

información relacionada