Wie kann ich nur die Dateien eines bestimmten Benutzers komprimieren?

7

Ich mag zip, es ist einfach, aber vor kurzem musste ich nur die Datei komprimieren, die einem Benutzer in einem Verzeichnis gehört.

Ich habe das Handbuch gelesen und kann keine Option finden, um beispielsweise Dinge zu tun wie:

zip /tmp/file.zip -own antoine -r /usr/something/* 

Verpasse ich die Option oder ist sie möglicherweise mit einem anderen Archivstandardformat möglich? (Ich bin offen für Vorschläge, obwohl ich unter AIX arbeite und möglicherweise einige Optionen oder Binärdateien verpasse.)

Kiwy
quelle
Wenn die Dateinamen und Verzeichnisnamen keine Leerzeichen enthalten, können Sie die Ausgabe von find -user antoineals Argumente zum Komprimieren verwenden. zipLeider gibt es keine Option zum Lesen von NUL-getrennten Dateinamen und daher können Dateien mit Leerzeichen und Zeilenumbrüchen im Namen nicht sehr gut verarbeitet werden, wenn sie von einem anderen Befehl bereitgestellt werden. Alternativ können Sie ein Python-Skript schreiben, es verfügt über ein gutes Zip-Modul und spezielle Dateinamen können problemlos verarbeitet werden.
Anthon
@anthon, ich denke, das könnte meine tatsächliche Situation beeinträchtigen, da keine Datei einen Platz in ihrem Namen
bekommt

Antworten:

11

Sie können versuchen, die relevanten Dateien zu finden mit find:

find /usr/something -maxdepth 1 -user antoine

Sie können dann verwenden -exec, um eine Zip-Datei aus den Ergebnissen von find:

find /usr/something -maxdepth 1 -user antoine -exec zip /tmp/file.zip {} +

Lassen Sie die maximale Tiefe weg, wenn Sie wiederkehren möchten.

Anthon
quelle
-own? : D sind Sie sicher
Kiwy
@ Kiwy versucht zwei Dinge gleichzeitig zu tun, aktualisiert
Anthon
posixy
Nun,
@ Kiwy afaik gibt es keine POSIX-konforme Python: p
Anthon
@ Kiwy, es gibt kein POSIX zip. Das POSIX-Äquivalent von -maxdepth 1ist, \( -name . -o -prune \)obwohl hier die Chancen stehen -mindepth 1 -maxdepth 1, dass Sie wollen , das heißt ! -name . -prune.
Stéphane Chazelas
6

Mit zsh:

zip mine.zip ./*(.U)

um meine (regulären) Dateien zu komprimieren.

zip antoine.zip ./*(.u:antoine:)

Antoines zu reißen

Stéphane Chazelas
quelle
1
Wenn Sie es nicht verwenden zsh, es aber zufällig installiert haben (OS X stellt eine Kopie bereit), können Sie es verwenden zsh -c 'zip ...'.
Blacklight Shining
kein Glück, kein zsh installiert, fand die Lösung sehr schön, ich sollte mir dieses zsh-Ding ansehen
Kiwy
5

Verwenden Sie nur Funktionen, die unter AIX oder anderen POSIX- und kaum mehr Systemen verfügbar sind:

find /usr/something/* /usr/something/.[!.]* /usr/something/..?* \
     -prune -type f -user antoine -exec zip -r /tmp/file.zip {} +

findrekursiv in Unterverzeichnisse. Um dies zu vermeiden, -pruneweist es an, nicht in die Verzeichnisse abzusteigen, auf die es stößt. Das ist nicht gut, wenn ich renne, find /usr/something -type d -prune -o …weil dann /usr/somethingübersprungen würde. Also führe ich findalle Einträge in diesem Verzeichnis aus, außer .und ...

Eine einfachere Redewendung ist es, in das Verzeichnis zu wechseln und das Startverzeichnis .speziell zu behandeln. Hier würde es das resultierende Archiv ändern, das ./foostattdessen Pfade der Form hätte usr/something/foo. Diese Technik basiert auf der Tatsache, dass -name .nur das Startverzeichnis übereinstimmt und jede andere angetroffene Datei ihren eigenen Namen hat.

cd /usr/something &&
find . ! -name . -prune -type f -user antoine -exec …

Beachten Sie, dass zipdies mehrmals ausgeführt werden kann, wenn die Liste der Dateinamen für einen einzelnen Aufruf zu lang ist. Dies ist in Ordnung, da zip -rvorhandene Dateien im Archiv ersetzt werden. Wenn Sie einen anderen Archivierer verwenden, achten Sie darauf, ihn nicht in einem Modus aufzurufen, in dem ein neues Archiv erstellt wird (z. B. nicht verwenden tar -c).

Gilles 'SO - hör auf böse zu sein'
quelle
Sie können tun , find /usr/something/. ! -name . -prune ...Sie brauchen nicht cdhinein oder die gesamte Dateiliste übergeben , um findShell - Platzhalter verwenden.
Stéphane Chazelas
3

Wie wäre es mit

find /usr/something -maxdepth 1 -user antoine | zip /tmp/file.zip -@
doneal24
quelle