find . -type f | \
while read -r x
do
gzip -c "$x" > "$x.gz"
done
El -c
empuja el resultado a stdout y mantiene el original solo. La desventaja es que necesita encontrar los archivos usted mismo. Para recorridos más sofisticados, puede usar find(1)
, sin embargo, como arriba:.
busca a partir del directorio actual y -type f
devuelve el nombre de todos los archivos regulares.
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 '*.html
etc.) en lugar de como ahora, excluyendo algunos archivos (archivos ya comprimidos, de copia de seguridad y temporales).
También maneja bien los espacios en el nombre del archivo.
Cambiar gzip
a echo gzip
para las pruebas. O sáltate la parte -exec por completo.
Editar: Oh, olvidé mencionar que esto no verifica si <target>.gz
ya existe. Esto puede o no ser un problema.
Editar2: Ok, aquí vamos con algo que verifica el archivo existente. Si eso se puede querer. Perdón por la monotonía.
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 '*[~#]' \))
Mi find
-foo tal vez no sea lo que podría ser, es muy posible que se pueda omitir directamente en find.
gzip -k
opción
gzip 1.6 (junio de 2013) agregó el -k, --keep
opción, por lo que ahora puede:
gzip -kr .
y no eliminará sus archivos originales.
Encontrado en:https://unix.stackexchange.com/questions/46786/how-to-tell-gzip-to-keep-original-file