So komprimieren Sie eine Liste von Dateien unter Linux

17

Ich habe viele Dateien, die ich in ein einziges Verzeichnis packen muss. Ich möchte nicht alle Dateien im Verzeichnis komprimieren, sondern nur diejenigen, die einer bestimmten Abfrage entsprechen.

Ich tat

grep abc file-* > out.txt 

um eine Datei mit allen Instanzen von "abc" in jeder Datei zu erstellen. Ich brauche die Dateien selbst. Wie kann ich bash anweisen, nur diese Dateien zu komprimieren?

John Mangual
quelle
Wildcards funktionieren nicht? Warum? Wenn ich fragen kann ...
Herran
@jherran Ich möchte nicht alle Dateien im Verzeichnis komprimieren, sondern nur diejenigen, die einer bestimmten Abfrage entsprechen. Ich habe grep abc file-* > out.txteine Datei mit allen Instanzen von "abc" in jeder Datei erstellt. Ich brauche die Dateien selbst.
John Mangual
Was @jherran bedeutet zip ZipFile.zip file-*, ist der naheliegende Weg, dies zu tun. Sie benötigen eine Zwischendatei nur, wenn Sie eine komplexe findoder eine Verkettung von Dateilisten aus verschiedenen Suchvorgängen verwenden.
AFH

Antworten:

31

Sehr einfach:

zip archive -@ < out.txt

Das heißt, wenn Ihre out.txtDatei einen Dateinamen pro Zeile enthält. Alle Dateien aus werden out.txtzu einem Archiv mit dem Namen hinzugefügt archive.zip.

Die -@Option ermöglicht das zipLesen von STDIN.

Wenn Sie das Erstellen einer temporären out.txtDatei überspringen möchten , können Sie die grepFunktion zum Drucken von Dateinamen ebenfalls verwenden. -rAktiviert die rekursive Suche (in Ihrem Fall möglicherweise nicht erforderlich) und gibt -lnur Dateinamen aus:

grep -rl "abc" file-* | zip archive -@
slhck
quelle
Funktioniert gut, es sei denn, ich habe eine Listendatei, in der Dateinamen Leerzeichen enthalten. Ich habe versucht, beide mit `` zu maskieren und sie nicht zu maskieren, einmal in Anführungszeichen und einmal ohne Anführungszeichen um den Dateinamen (eine Zeile - ein Dateiname). Bisher hat nichts funktioniert.
Thomas W.
2
Ich habe es mit `\` Leerzeichen und keinen Anführungszeichen in der Datei und den folgenden gemacht:cat out.txt | while read line ; do xargs zip archive.zip $line ; done
Thomas W.
Wenn Sie Dateien mit ähnlichen Namen zip archive.zip $(ls common_name*)
komprimieren
@ chepe263 Dies bricht ab, wenn Dateien Leerzeichen im Pfad haben. Generell wird davon abgeraten, die Ausgabe zu analysieren.
Slhck
0

Alternativen zur akzeptierten Antwort von hier :

cat out.txt | zip -@ zipfile.zip
cat out.txt | zip -@ - > zipfile.zip
zip zipfile.zip $(cat out.txt) -r
zip zipfile.zip -r . -i@out.txt
sancho.s Setzen Sie Monica wieder ein
quelle