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 gzip
no 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 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 tiene nombres de archivos con espacios, líneas nuevas, etc.
Una solución más limpia, sin depender gzip
de omitir archivos con un .gz
final es, que también maneja archivos no comprimidos en subdirectorios:
find . -type f ! -name "*.gz" -exec gzip {} \;
¹ Como se izkata
comentó: usar .gz
solo para mejorar esto, no funcionaría. Tendría que usar grep -vF .gz
o grep -v '\.gz$'
. Eso todavía deja el peligro de procesar ls
'salida
$
para que quede más claro. Y de.
todos modos no escapó , por lo que solo va a excluir archivos que comienzan congz
(ya que no tienen "ningún carácter antesgz
")$
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".gz
cualquier 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.