Komprimieren Sie jede Datei in einem Verzeichnis in eine eigene komprimierte Datei

24

Wie komprimiere ich jede Datei in einem Verzeichnis in ein eigenes tar, wobei der Name für jede Datei erhalten bleibt?

dh file1.out file2.out

->

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

DD.
quelle

Antworten:

64

In diesem Szenario macht es keinen Sinn, jede Datei in einer separaten TAR-Datei abzulegen. Sie können gzipsie direkt komprimieren:

gzip *

wird dazu führen file1.out.gz, file2.out.gzetc.

Sie würden es tarnur verwenden, wenn Sie ein komprimiertes Archiv als einzelne Datei benötigen würden.

Wenn Sie für jede Datei ein tar-Archiv benötigen, können Sie es folgendermaßen erstellen:

for i in *; do tar -czf $i.tar.gz $i; done
Sven
quelle
7
+1 - Es gibt keinen Grund, für eine einzelne Datei ein tar (Bandarchiv) zu erstellen. Komprimieren Sie einfach das, was Sie komprimieren möchten - das Ergebnis wird geringfügig kleiner und macht für Leute, die die Dateien extrahieren, unendlich mehr Sinn.
Voretaq7
So tarieren Sie jedes einzelne Unterverzeichnis (nur eine Ebene tief) und entfernen das Original:find . -maxdepth 1 -type d ! -path . | while read a_dir; do tar -zcvf ${a_dir}.tgz ${a_dir} --remove-files; done
xb.
(Ich kann meinen obigen Kommentar nach 5 Minuten nicht bearbeiten.) Eine einfachere / sicherere Version:find . -maxdepth 1 -mindepth 1 -type d -exec tar -zcvf {}.tgz {} --remove-files \;
xb.
9

Aufbauend auf der Antwort von @ SvenW (die nur für das aktuelle Verzeichnis funktioniert) können Sie auch eine rekursive Verzeichnisstruktur verwenden, wenn Sie über eine RIESIGE Anzahl von Dateien verfügen oder dies tun möchten

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

Wenn Sie die Ausgabe in ein anderes Verzeichnis verschieben müssen (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
flauschige
quelle
1
find . -type f -exec gzip {} \;wird ausreichen. Der zweite Code schlägt mit Dateinamen fehl, die Leerzeichen und dergleichen enthalten.
Benutzer unbekannt
Einige Shells mögen keine Bare {} s und die zweite macht etwas ganz anderes als die erste (und ich war mir der Abstandsprobleme bewusst, aber das ist etwas schwierig zu handhaben).
flauschige
Wenn Sie eine solche Shell kennen, bitte ich Sie, meine Frage hier zu beantworten: unix.stackexchange.com/questions/8647/… . Niemand konnte etwas benennen, was heute noch in Gebrauch ist. Wenn Sie sich eines Risikos Ihrer Antwort bewusst sind, ist es möglicherweise eine gute Idee, es in Ihrer Antwort zu benennen.
Benutzer unbekannt
@userunknown Ich bin auf (t) csh erzogen worden, das auf einmal ziemlich viele Probleme mit ungelockten geschweiften Klammern hatte, obwohl es nicht mehr scheint (aber ich entkomme immer noch {}aus Gewohnheit). Andere haben diese jedoch bereits als Antworten auf Ihre Frage veröffentlicht.
flauschige
Oder, um alle nicht-binären Dateien zu komprimieren:find . -type f -exec grep -Iq . {} \; -and -exec gzip {} \;
xb.
0

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
Mats
quelle