
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 tar
comando. También es posible que desees canalizar el ls
enlace xargs
para 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 tar
e intentan ejecutarla como un comando en cada iteración del bucle. Lo primero que tar
se 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!