Use gzip para comprimir los archivos en un directorio, excepto los archivos .gz ya existentes

19

Tengo un directorio de registros que me gustaría configurar un trabajo para comprimir usando gzip . El problema es que no quiero volver a comprimir los registros que ya comprimí.

Intenté usarlo ls | grep -v gz | gzip, pero eso no parece funcionar.

¿Hay alguna forma de hacer esto? Básicamente quiero gzip cada archivo en el directorio que no termina en .gz.

jabbajac
fuente

Respuestas:

26

Solo puedes hacer:

gzip *

gzip te dirá que omite los archivos que ya tienen un .gz final.
Si ese mensaje se interpone en el camino, puede usar:

gzip -q *

Lo que probaste no funcionó, porque gzipno lee los nombres de los archivos para comprimir desde stdin, para que eso funcione deberías usar:

ls | grep -v gz | xargs gzip

Excluirá los archivos con el patrón gzen cualquier parte del nombre del archivo, no solo al final. También debe tener en cuenta que analizar la salida de lses peligroso cuando tiene nombres de archivos con espacios, líneas nuevas, etc.

Una solución más limpia, sin depender gzipde omitir archivos con un .gzfinal es, que también maneja archivos no comprimidos en subdirectorios:

find .  -type f ! -name "*.gz" -exec gzip {} \;



¹ Como se izkatacomentó: usar .gzsolo para mejorar esto, no funcionaría. Tendría que usar grep -vF .gzo grep -v '\.gz$'. Eso todavía deja el peligro de procesar ls'salida

Anthon
fuente
1
"... eso hace que sea menos probable que coincida con alguna parte interna de un nombre de archivo" - es grep, solo utilícelo $para que quede más claro. Y de .todos modos no escapó , por lo que solo va a excluir archivos que comienzan con gz(ya que no tienen "ningún carácter antes gz")
Izkata
1
@Izkata: No, incluido el punto sin escape y sin anclar la expresión regular con la $exclusión ( -v) de todos los archivos que tienen nombres que constan de tres o más caracteres, incluido cualquier carácter seguido de "gz" en cualquier parte del nombre de archivo. Por lo tanto, incluirá archivos con nombres que comienzan con "gz".
Pausado hasta nuevo aviso.
1
@DennisWilliamson Mi último comentario no fue claro, también va a excluir archivos con gzcualquier parte del nombre (excepto el inicio). Entonces es mejor anclarlo de todos modos. Al no haberlo usado $, se leía como si no te dieras cuenta de lo que .significa en una expresión regular, de ahí el resto del comentario confuso.
Izkata