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?


la source

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.

Boldewyn
la source
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.

plundra
la source
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

Ken Wayne VanderLinde
la source
1
Cela ne fonctionne probablement que lorsque vous compressez un seul fichier à la fois.
its_me
0
gzip -rc `ls` > archive.gz

Testé sur Debian (gzip 1.3.12-6)

tannerli
la source
Cela crée une archive. L'OP veut des archives séparées. lsest inutile, utilisez *.
pause jusqu'à nouvel ordre.