Ich schreibe ein Skript, in dem ich Dateien komprimiere.
Es besteht die Möglichkeit, dass ich eine Datei komprimiere, eine Datei mit demselben Namen erstelle und versuche, diese ebenfalls zu komprimieren, z
$ ls -l archive/
total 4
-rw-r--r-- 1 xyzzy xyzzy 0 Apr 16 11:29 foo
-rw-r--r-- 1 xyzzy xyzzy 24 Apr 16 11:29 foo.gz
$ gzip archive/foo
gzip: archive/foo.gz already exists; do you wish to overwrite (y or n)? n
not overwritten
Mithilfe von gzip --force
kann ich das Überschreiben von gzip erzwingen. foo.gz
In diesem Fall besteht jedoch eine gute Chance, dass beim Überschreiben Daten verloren gehen foo.gz
. Es scheint keinen Befehlszeilenschalter zu geben, der gzip zwingt, .gz
Dateien in Ruhe zu lassen ... eine nicht interaktive Version des Drückens von 'n' an der Eingabeaufforderung.
Ich habe versucht gzip --noforce
und gzip --no-force
gehofft, dass diese dem GNU-Optionsstandard folgen, aber keiner von beiden hat funktioniert.
Gibt es eine direkte Umgehung dafür?
Bearbeiten:
Es stellt sich heraus, dass es sich oft lohnt, die Infoseite und nicht die Manpage zu lesen.
Von der Infoseite:
`--force'
`-f'
Force compression or decompression even if the file has multiple
links or the corresponding file already exists, or if the
compressed data is read from or written to a terminal. If the
input data is not in a format recognized by `gzip', and if the
option `--stdout' is also given, copy the input data without
change to the standard output: let `zcat' behave as `cat'. If
`-f' is not given, and when not running in the background, `gzip'
prompts to verify whether an existing file should be overwritten.
Der Manpage fehlte der Text und wenn sie nicht im Hintergrund lief
Wenn gzip im Hintergrund ausgeführt wird, wird es nicht aufgefordert und nicht überschrieben, es sei denn, die -f
Option wird aufgerufen.
quelle
find ./ ! -name "*gz" -exec gzip {} \; &
funktioniert:find ./ ! -name "*gz" -print0 | xargs -0 -n 1 -t gzip
gzip meldet:gzip: ./2012-July.txt.gz already exists; not overwritten
Antworten:
Mir ist aufgefallen, dass der beste Weg, den unerwünschten Effekt zu vermeiden, darin besteht , das Programm nicht aufzufordern, den unerwünschten Effekt auszuführen. Das heißt, sagen Sie ihm einfach nicht, dass eine Datei komprimiert werden soll, wenn die Datei bereits in komprimierter Form vorliegt.
z.B:
oder kürzer (ausführen,
true
wenn es eine file.gz gibt, Datei andernfalls komprimieren)quelle
poke a file
.Die nächste Sache, die ich zu einem einzelnen Befehl finden konnte, ist die folgende:
Der
yes
Befehl wird gedruckt,y
gefolgt von einem Zeilenvorschub auf stdout, bis ein Signal empfangen wird. Wenn es ein Argument gibt, wird dieses anstelle von ausgegebeny
. In diesem Fall wird gedruckt,n
bis gzip beendet wird, wodurch die Pipe geschlossen wird.Dies entspricht der
n
wiederholten Eingabe über die Tastatur. Dadurch wird die Frage automatisch beantwortetgzip: archive/foo.gz already exists; do you wish to overwrite (y or n)?
Im Allgemeinen denke ich, dass es besser ist, nicht zu versuchen, die Dateien zu komprimieren, wenn die entsprechende komprimierte Datei vorhanden ist. Meine Lösung ist geräuschvoller, entspricht jedoch meinen besonderen Anforderungen an einen Drop-In-Ersatz für den
gzip
Befehl, der in einer Konfigurationsdatei gespeichert ist.quelle
gzip
Ausfahrten2