Tengo un directorio de registros que me gustaría configurar un trabajo para comprimir usandozip. El problema es que no quiero volver a comprimir los registros que ya comprimí.
Intenté usar ls | grep -v gz | gzip
, pero parece que no funciona.
¿Hay alguna forma de hacer esto? Básicamente, quiero comprimir todos los archivos del directorio que no terminen en .gz.
Respuesta1
Puedes simplemente hacer:
gzip *
gzip le dirá que omite los archivos que ya tienen un .gz
final.
Si ese mensaje se interpone en tu camino, puedes usar:
gzip -q *
Lo que intentaste no funcionó, porque gzip
no lee los nombres de los archivos a comprimir desde la entrada estándar, para que eso funcione tendrías que usar:
ls | grep -v gz | xargs gzip
Excluirá los archivos con el patrón gz
en cualquier parte del nombre del archivo, no solo al final.¹ También debe tener en cuenta que analizar la salida de ls
es peligroso cuando hay nombres de archivos involucrados con espacios, nuevas líneas, etc.
Una solución más limpia, que no depende de gzip
omitir archivos con una .gz
terminación, es que también maneja archivos no comprimidos en subdirectorios:
find . -type f ! -name "*.gz" -exec gzip {} \;
¹ Como izkata
se comentó: usar .gz
solo para mejorar esto no funcionaría. Necesitarías usar grep -vF .gz
o grep -v '\.gz$'
. Eso todavía deja el peligro de procesar ls
la salida.