gzip todos los archivos sin eliminarlos


11

Necesito comprimir todos los archivos en un directorio por separado, incluidos todos los archivos en los subdirectorios sin eliminar los originales después. Digamos que tengo index.html, quiero tener al final index.html.gzip AND index.html.

Puedo comprimir todos los archivos en mi directorio a través de

gzip -r .

Pero también quiero conservar los archivos originales.

es posible?

Respuestas:


9
find . -type f | \
while read -r x
do
  gzip -c "$x" > "$x.gz"
done

El -cempuja el resultado a stdout y mantiene el original solo. La desventaja es que necesita encontrar los archivos usted mismo. find(1)Sin embargo, para un recorrido más sofisticado, puede usar , como se indica arriba: .búsquedas que comienzan desde el directorio actual y -type fdevuelve el nombre de cada archivo normal.


¿Por qué *.*en ls?

@pooh: *.*coincide con todos los archivos nombrados regularmente, y generalmente no hay directorios. Por supuesto, solo funciona en la mayoría de los casos y generalmente no si lo necesita. Luego usa el findcomando.
Boldewyn

@Boldewyn: la pregunta era comprimir todos los archivos en un directorio. ls *.*no seleccionará archivos como TODO .

lsno se necesita en absoluto : for x in *. Sin embargo, el uso finddebe ser find . -type f | while read -r x.
Pausado hasta nuevo aviso.

Respuesta actualizada Gracias por el -rencendido read.
Boldewyn

5
find . -type f -not \( -name '*.gz' -or -name '*[~#]' \) -exec sh -c 'gzip -c "{}" > "{}.gz"' \;

Puede cambiarlo fácilmente para incluir lo que desea comprimir ( -name '*.txt -or -name '*.htmletc.) en lugar de como ahora, excluyendo algunos archivos (ya comprimidos, archivos de respaldo y temporales).

Maneja espacios en el nombre de archivo muy bien también.

Cambiar gzipa echo gzippara pruebas. O omita la parte -exec por completo.

Editar: Oh, olvidé mencionar que esto no verifica si <target>.gzya existe. Esto puede o no ser un problema.

Edit2: Ok, aquí vamos con algo que verifica el archivo existente. Si eso puede ser deseado. Perdón por la oneliney-ness.

while read file; do if [ ! -f "$file.gz" ]; then echo "Compressing $file"; gzip -c "$file" > "$file.gz"; else echo "Not overwriting $file.gz";  fi  done < <(find . -type f -not \( -name '*.gz' -or -name '*[~#]' \))

My find-foo tal vez no sea lo que podría ser, es muy posible que se salte directamente en find.


1
solo lea que -name debería aparecer antes de -type para evitar llamar a stat en cada archivo.

@Ben tiene sentido, buena entrada! Para árboles grandes puede ser notable.
plundra

2

Solo agregue la opción -c, creo que esto debería funcionar


1
Esto probablemente solo funciona cuando se comprime un solo archivo a la vez.
es_me


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.