Tar: Vermeiden Sie die Archivierung von Dateien, die größer als eine bestimmte Größe sind

11

Ich möchte Dateien (mit Teer) archivieren, die weniger als 3 MB groß sind. Ich möchte aber auch die Verzeichnisse behalten, in denen diese Dateien vorhanden sind. (Ich kann also keinen findBefehl verwenden). Ich möchte nur die Dateien vermeiden, die größer als 3 MB sind. Wie kann das gemacht werden?

Nixnotwin
quelle
2
Warum kannst du es nicht findwieder benutzen ?
Ignacio Vazquez-Abrams
Kann der Befehl find die Verzeichnisse intakt halten?
Nixnotwin

Antworten:

23

Einfacher als Sie denken:

$ tar cf small-archive.tar /big/tree --exclude-from <(find /big/tree -size +3M)

Verwenden Sie in einem halbbezogenen Hinweis (in Bezug auf Ihre Aussage, dass Sie find nicht verwenden können), um eine Liste aller Dateien (einschließlich Verzeichnisse) unter einem Pfad abzüglich Dateien größer als 3 MB zu erhalten, Folgendes:

$ find . -size -3M -o -type d

Sie könnten dann tun:

$ tar cf small-archive.tar --no-recursion --files-from <(find /big/tree -size -3M -o -type d)

Aber ich würde das erste vorziehen, da es einfacher ist, klar ausdrückt, was Sie wollen, und zu weniger Überraschungen führt.

MikeyB
quelle
2
+1 Was! Eine höfliche, freundliche Person auf SF?!?
Jongosi
1
+1 gleiche Sedimente. zu viele egoistische Trolle auf SF in letzter Zeit.
Patoshi
* Gefühle: P :)
MikeyB
1

Wenn der Dateiname eckige Klammern enthält, müssen Sie in einigen Systemen explizit ausschließen. Beispielsweise

$ mkdir test
$ echo "abcde123456" > ./test/a[b].txt
$ echo "1" > ./test/a1.txt
$ ls -la ./test
total 16
drwxrwxr-x 2 user user 4096 Jan 10 16:38 .
drwx------ 4 user user 4096 Jan 10 16:38 ..
-rw-rw-r-- 1 user user    2 Jan 10 16:38 a1.txt
-rw-rw-r-- 1 user user   12 Jan 10 16:38 a[b].txt
$ tar -zcvpf a.tar.gz ./test
./test/
./test/a[b].txt
./test/a1.txt
$ tar -zcvpf a3.tar.gz ./test --exclude-from <(find ./test -type f -size +3c)
./test/
./test/a[b].txt
./test/a1.txt
$ tar -zcvpf ax.tar.gz ./test --exclude-from <(find ./test -type f -size +3c) --exclude '*\[*'
./test/
./test/a1.txt
Chen Deng-Ta
quelle
0

Wenn Sie versuchen, dies auf einem Server über SSH zu tun, funktioniert dies aus diesem Grund nicht . Um dies zu umgehen, können Sie Pipes und Xargs verwenden:

find /path/to/dir -type f -size -3M | xargs tar cf archive.tar
Heulen
quelle