J'écris un script dans lequel je compresse des fichiers.
Il y a une possibilité que je puisse compresser un fichier, créer un fichier du même nom et essayer de le compresser également, par exemple
$ 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
En utilisant gzip --force
, je peux forcer gzip à écraser foo.gz
, mais dans ce cas, je pense qu'il y a de fortes chances que je puisse perdre des données si j'écrase foo.gz
. Il ne semble pas y avoir de commutateur de ligne de commande pour forcer gzip à laisser les .gz
fichiers seuls ... une version non interactive de la pression de 'n' à l'invite.
J'ai essayé gzip --noforce
et gzip --no-force
, en espérant que ceux-ci pourraient suivre la norme des options GNU, mais ni l'un ni l'autre n'a fonctionné.
Existe-t-il une solution simple à cela?
Éditer:
Il s'avère que c'est l'une des fois où il est payant de lire la page d'informations plutôt que la page de manuel.
Depuis la page info:
`--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.
Le texte manquait dans la page de manuel et lorsqu'elle n'était pas exécutée en arrière-plan
Lors de l'exécution en arrière-plan, gzip ne demandera pas et ne remplacera pas sauf si l' -f
option est invoquée.
la source
find ./ ! -name "*gz" -exec gzip {} \; &
cela fonctionne:find ./ ! -name "*gz" -print0 | xargs -0 -n 1 -t gzip
gzip rapporte:gzip: ./2012-July.txt.gz already exists; not overwritten
Réponses:
Il m'est apparu que la meilleure façon d'éviter l'effet indésirable est de ne pas demander au programme d'effectuer l'effet indésirable. Autrement dit, ne lui dites pas de compresser un fichier si le fichier est déjà présent sous forme compressée.
par exemple:
ou plus court (exécuter
true
s'il y a un fichier.gz, compresser le fichier sinon)la source
poke a file
.La chose la plus proche que j'ai pu trouver à une seule commande est la suivante:
La
yes
commande imprimey
suivie d'un saut de ligne vers stdout jusqu'à ce qu'elle reçoive un signal. S'il a un argument, il l'imprimera au lieu dey
. Dans ce cas, il imprimen
jusqu'à la sortie de gzip, fermant ainsi le tuyau.C'est l'équivalent d'entrer
n
plusieurs fois sur le clavier; cela répondra automatiquement à la questiongzip: archive/foo.gz already exists; do you wish to overwrite (y or n)?
En général, je pense qu'il vaut mieux ne pas essayer de compresser les fichiers si le fichier gzippé correspondant existe; ma solution est plus bruyante, mais elle correspond à mes besoins particuliers pour un remplacement direct de la
gzip
commande, assis dans un fichier de configuration.la source
gzip
sorties2