gzip tous les fichiers sans les supprimer


11

J'ai besoin de compresser tous les fichiers dans un répertoire séparément, y compris tous les fichiers dans les sous-répertoires sans supprimer les originaux par la suite. Disons que j'ai index.html, je veux avoir à la fin index.html.gzip ET index.html.

Je suis capable de compresser tous les fichiers dans mon répertoire via

gzip -r .

Mais je veux aussi garder les fichiers originaux.

Est-ce possible?

Réponses:


9
find . -type f | \
while read -r x
do
  gzip -c "$x" > "$x.gz"
done

Le -cpousse le résultat à stdout et conserve l'original seul. L'inconvénient est que vous devez trouver les fichiers vous-même. Pour une traversée plus sophistiquée, vous pouvez find(1)cependant utiliser , comme ci-dessus: des .recherches à partir du répertoire courant, et -type fretourne le nom de chaque fichier normal.


Pourquoi *.*en ls?

@pooh: *.*correspond à tous les fichiers nommés régulièrement, et généralement aucun répertoire. Bien sûr, cela ne fonctionne que dans la plupart des cas et généralement pas si vous en avez besoin. Utilisez ensuite la findcommande.
Boldewyn

@Boldewyn: la question était de compresser tous les fichiers dans un répertoire. ls *.*ne choisira pas de fichiers comme TODO .

lsn'est pas nécessaire du tout : for x in *. Cependant, l'utilisation finddevrait l'être find . -type f | while read -r x.
pause jusqu'à nouvel ordre.

Réponse mise à jour. Merci pour l' -rallumage read.
Boldewyn

5
find . -type f -not \( -name '*.gz' -or -name '*[~#]' \) -exec sh -c 'gzip -c "{}" > "{}.gz"' \;

Vous pouvez facilement le changer pour inclure ce que vous voulez compresser ( -name '*.txt -or -name '*.htmletc.) au lieu de comme maintenant, en excluant certains fichiers (déjà compressés, fichiers de sauvegarde et temporaires).

Gère également très bien les espaces dans le nom de fichier.

Remplacez gzippar echo gzippour tester. Ou ignorez la partie -exec tous ensemble.

Edit: Oh, j'ai oublié de mentionner que cela ne vérifie pas s'il <target>.gzexiste déjà. Cela peut ou non être un problème.

Edit2: Ok, nous allons ici avec quelque chose qui vérifie le fichier existant. Si cela peut être voulu. Excusez-moi d'être en ligne.

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 '*[~#]' \))

Mon find-foo n'est peut-être pas ce qu'il pourrait être, il peut très bien être possible de sauter directement dans find.


1
il suffit de lire que -name doit précéder -type pour éviter d'appeler stat sur chaque fichier.

@Ben est logique, bonne entrée! Pour les grands arbres, cela peut être perceptible.
plundra

2

Ajoutez simplement l'option -c, je pense que cela devrait fonctionner


1
Cela ne fonctionne probablement que lorsque vous compressez un seul fichier à la fois.
its_me


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.