Respuestas:
Poner cada archivo en un archivo tar separado no tiene ningún sentido en este escenario. Puede usar gzip
para comprimirlos directamente:
gzip *
resultará en file1.out.gz
, file2.out.gz
etc.
Solo lo usaría tar
si necesitara un archivo comprimido como un solo archivo.
Si necesita un archivo tar para cada archivo, puede crearlo así:
for i in *; do tar -czf $i.tar.gz $i; done
find . -maxdepth 1 -type d ! -path . | while read a_dir; do tar -zcvf ${a_dir}.tgz ${a_dir} --remove-files; done
find . -maxdepth 1 -mindepth 1 -type d -exec tar -zcvf {}.tgz {} --remove-files \;
Para construir sobre la respuesta de @ SvenW (que solo funcionará en el directorio actual), si tiene una ENORME cantidad de archivos o desea hacerlo en una estructura de directorio recursiva, también puede usar
find . -type f -exec gzip \{\} \;
y si necesita colocar la salida en un directorio diferente (en este ejemplo ../target
) y no desea eliminar los originales, puede hacer algo como:
find . -type f -print | while read fname ; do
mkdir -p "../target/`dirname \"$fname\"`"
gzip -c "$fname" > "../target/$fname.gz"
done
find . -type f -exec gzip {} \;
será suficiente. El segundo código fallará con nombres de archivos que contengan espacios y similares.
{}
como una costumbre). Sin embargo, otros ya los han publicado como respuestas a su pregunta.
find . -type f -exec grep -Iq . {} \; -and -exec gzip {} \;
Prueba este:
#!/bin/bash
for fich in *; do
if [ "$fich" != "*" ] ; then
gzip -9 -c $fich > $fich.tar.gz
\mv $fich.tar.gz $fich
fi
done