Comprima cada archivo en un directorio en su propio archivo comprimido


24

¿Cómo comprimo todos los archivos de un directorio en su propio alquitrán mientras preserva el nombre de cada archivo?

es decir, file1.out file2.out

->

file1.out.tar.gz file2.out.tar.gz

Respuestas:


64

Poner cada archivo en un archivo tar separado no tiene ningún sentido en este escenario. Puede usar gzippara comprimirlos directamente:

gzip *

resultará en file1.out.gz, file2.out.gzetc.

Solo lo usaría tarsi 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

77
+1: no hay ninguna razón para crear un archivo tar (Tape ARchive) para un solo archivo. Simplemente comprima lo que desea comprimir: el resultado será marginalmente más pequeño y tendrá infinitamente más sentido para las personas que extraen los archivos.
voretaq7

Para alquitratar cada subdirectorio individual (solo un nivel de profundidad) y eliminar el original:find . -maxdepth 1 -type d ! -path . | while read a_dir; do tar -zcvf ${a_dir}.tgz ${a_dir} --remove-files; done
xb.

(no puedo editar mi comentario anterior después de 5 minutos) Una versión más simple / segura:find . -maxdepth 1 -mindepth 1 -type d -exec tar -zcvf {}.tgz {} --remove-files \;
xb.

9

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

1
find . -type f -exec gzip {} \;será suficiente. El segundo código fallará con nombres de archivos que contengan espacios y similares.
usuario desconocido

A algunos shells no les gustan los {} s desnudos, y el segundo hace algo notablemente diferente al primero (y yo estaba al tanto de los problemas de espaciado, pero es algo difícil de tratar).
esponjoso

Si conoces esa concha, te invito a responder mi pregunta aquí: unix.stackexchange.com/questions/8647/… . Nadie pudo nombrar algo que se usa actualmente hasta ahora. Si conoce el riesgo de su respuesta, puede ser una buena idea nombrarla en su respuesta.
usuario desconocido

@userunknown Me criaron en (t) csh, que tenía muchos problemas con llaves sin escapes a la vez, aunque ya no parece (pero sigo escapando {}como una costumbre). Sin embargo, otros ya los han publicado como respuestas a su pregunta.
esponjoso

O, para comprimir todos los archivos no binarios:find . -type f -exec grep -Iq . {} \; -and -exec gzip {} \;
xb.

0

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.