Frage Komprimiere jede Datei in einem Verzeichnis in eine eigene komprimierte Datei


Wie komprimiere ich jede Datei in einem Verzeichnis in ihren eigenen Teer, während der Name für jede Datei beibehalten wird?

d.h. Datei1.out Datei2.out

->

file1.out.tar.gz file2.out.tar.gz


20
2018-02-05 20:12


Ursprung




Antworten:


Jede Datei in eine separate TAR-Datei zu stellen, macht in diesem Szenario keinen Sinn. Sie können verwenden gzip um sie direkt zu komprimieren:

gzip *

wird darin enden, dass file1.out.gz, file2.out.gz usw.

Du würdest es benutzen tar nur wenn Sie ein komprimiertes Archiv als einzelne Datei benötigen.

Wenn Sie ein Tar-Archiv für jede Datei benötigen, können Sie es wie folgt erstellen:

for i in *; do tar -czf $i.tar.gz $i; done

55
2018-02-05 20:18



+1 - Es gibt keinen Grund, einen tar (Tape ARchive) für eine einzelne Datei zu erstellen. Komprimieren Sie einfach, was Sie komprimieren möchten - das Ergebnis wird geringfügig kleiner sein und für Leute, die die Dateien extrahieren, unendlich viel mehr Sinn machen. - voretaq7
Um jedes einzelne Unterverzeichnis (nur eine Ebene tief) zu tarnen und das Original zu entfernen: find . -maxdepth 1 -type d ! -path . | while read a_dir; do tar -zcvf ${a_dir}.tgz ${a_dir} --remove-files; done - xb.
(kann meinen Kommentar oben nicht nach 5 min bearbeiten) Eine einfachere / sicherere Version: find . -maxdepth 1 -mindepth 1 -type d -exec tar -zcvf {}.tgz {} --remove-files \; - xb.


Um auf @ SvenWs Antwort aufzubauen (die nur für das aktuelle Verzeichnis funktioniert), können Sie auch verwenden, wenn Sie eine HÄUFIGE Anzahl von Dateien haben oder dies in einer rekursiven Verzeichnisstruktur tun wollen

find . -type f -exec gzip \{\} \;

und wenn Sie die Ausgabe in ein anderes Verzeichnis (in diesem Beispiel ../target) und die Originale nicht entfernen möchten, können Sie Folgendes tun:

find . -type f -print | while read fname ; do
    mkdir -p "../target/`dirname \"$fname\"`"
    gzip -c "$fname" > "../target/$fname.gz"
done

9
2018-02-06 02:07



find . -type f -exec gzip {} \; wird ausreichen. Der zweite Code wird mit Dateinamen fehlschlagen, die Leerzeichen und ähnliches enthalten. - user unknown
Einige Shells mögen keine bare {} s, und die zweite macht etwas, das sich merklich von dem ersten unterscheidet (und ich war mir der Probleme mit dem Abstand bewusst, aber das ist etwas schwierig zu handhaben). - fluffy
Wenn Sie eine solche Shell kennen, lade ich Sie ein, hier meine Frage zu beantworten: unix.stackexchange.com/questions/8647/... . Niemand konnte etwas nennen, was heute so ist. Wenn Sie sich der Gefahr bewusst sind, dass Sie eine Antwort erhalten, ist es vielleicht eine gute Idee, sie in Ihrer Antwort zu nennen. - user unknown
@userunknown Ich wurde auf (t) csh erzogen, was zu einer Zeit ziemlich viele Probleme mit ungeschnittenen geschweiften Klammern hatte, obwohl es nicht mehr so ​​aussieht (aber ich fliehe immer noch {} als eine Gewohnheitskraft). Andere haben diese jedoch bereits als Antworten auf Ihre Frage gepostet. - fluffy
Oder um alle nicht binären Dateien zu komprimieren: find . -type f -exec grep -Iq . {} \; -and -exec gzip {} \; - xb.


Probier diese:

#!/bin/bash
for fich in *; do
    if [ "$fich" != "*" ] ; then
        gzip -9 -c $fich > $fich.tar.gz
        \mv $fich.tar.gz $fich
    fi
done

0
2017-09-16 18:51