Utilisez gzip pour compresser les fichiers dans un répertoire à l'exception des fichiers .gz déjà existants

19

J'ai un répertoire de journaux que je voudrais configurer un travail à compresser à l'aide de gzip . Le problème est que je ne veux pas recompresser les journaux que j'ai déjà compressés.

J'ai essayé d'utiliser ls | grep -v gz | gzip, mais cela ne semble pas fonctionner.

Y a-t-il un moyen de faire cela? Fondamentalement, je veux compresser tous les fichiers du répertoire qui ne se terminent pas par .gz.

jabbajac
la source

Réponses:

26

Vous pouvez simplement faire:

gzip *

gzip vous dira qu'il ignore les fichiers qui ont déjà une .gz fin.
Si ce message vous empêche d'utiliser:

gzip -q *

Ce que vous avez essayé n'a pas fonctionné, car gzipne lit pas les noms des fichiers à compresser depuis stdin, pour que cela fonctionne, vous devez utiliser:

ls | grep -v gz | xargs gzip

Vous gzexclurez les fichiers avec le motif n'importe où dans le nom de fichier, pas seulement à la fin.¹ Vous devez également noter que l'analyse de la sortie de lsest dangereuse lorsque vous avez des noms de fichiers avec des espaces, des sauts de ligne, etc., sont impliqués.

Une solution plus propre, sans compter gzippour ignorer les fichiers avec une .gzfin, gère également les fichiers non compressés dans les sous-répertoires:

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



¹ Comme izkataindiqué: utiliser .gzseul pour améliorer cela ne fonctionnerait pas. Vous auriez besoin d'utiliser grep -vF .gzou grep -v '\.gz$'. Cela laisse toujours le danger de traiter lsla sortie

Anthon
la source
1
"... cela le rend moins susceptible de correspondre à une partie interne d'un nom de fichier" - c'est grep, il suffit de l'utiliser $pour que ce soit plus clair. Et vous ne l'avez pas échappé de .toute façon, donc ça va seulement exclure les fichiers qui commencent par gz(puisqu'ils n'ont "aucun caractère avant gz")
Izkata
1
@Izkata: Non, y compris le point non échappé et ne pas ancrer l'expression régulière en $allant exclure ( -v) tous les fichiers qui ont des noms composés de trois caractères ou plus, y compris n'importe quel caractère suivi de "gz" n'importe où dans le nom de fichier. Il inclura donc des fichiers dont le nom commence par "gz".
pause jusqu'à nouvel ordre.
1
@DennisWilliamson Mon dernier commentaire n'était pas clair, il va également exclure les fichiers avec gzn'importe où dans le nom (sauf le début). Il est donc préférable de l'ancrer de toute façon. N'ayant pas utilisé $, cela se lisait comme si vous ne réalisiez pas ce que .signifie une expression régulière, d'où le reste du commentaire déroutant.
Izkata