Estoy escribiendo un script en el que estoy comprimiendo archivos.
Existe la posibilidad de que pueda comprimir un archivo, crear un archivo con el mismo nombre e intentar comprimir esto también, p. Ej.
$ 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
Al usar gzip --force
, puedo forzar a gzip a sobrescribir foo.gz
, pero en este caso, creo que hay una buena posibilidad de que pueda perder datos si sobrescribo foo.gz
. No parece haber un cambio de línea de comando para forzar a gzip a dejar los .gz
archivos solos ... una versión no interactiva de presionar 'n' en el indicador.
Lo intenté gzip --noforce
y gzip --no-force
, con la esperanza de que estos pudieran seguir el estándar de opciones de GNU, pero ninguno de estos funcionó.
¿Existe una solución directa para esto?
Editar:
Resulta que esta es una de las veces que vale la pena leer la página de información en lugar de la página de manual.
Desde la página de información:
`--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.
En la página del manual faltaba el texto y cuando no se ejecutaba en segundo plano.
Cuando se ejecuta en segundo plano, gzip no aparecerá y no se sobrescribirá a menos que -f
se invoque la opción.
fuente
find ./ ! -name "*gz" -exec gzip {} \; &
esto funciona:find ./ ! -name "*gz" -print0 | xargs -0 -n 1 -t gzip
informes de gzip:gzip: ./2012-July.txt.gz already exists; not overwritten
Respuestas:
Me di cuenta de que la mejor manera de evitar el efecto no deseado es no pedirle al programa que realice el efecto no deseado. Es decir, simplemente no le diga que comprima un archivo si el archivo ya está presente en forma comprimida.
p.ej:
o más corto (ejecutar
true
si hay un archivo.gz, comprimir el archivo de lo contrario)fuente
poke a file
.Lo más cercano que podría encontrar a un solo comando es lo siguiente:
El
yes
comando imprimey
seguido de un salto de línea a stdout hasta que recibe una señal. Si tiene un argumento, lo imprimirá en lugar dey
. En este caso, se imprimen
hasta que gzip sale, cerrando así la tubería.Esto es equivalente a ingresar
n
repetidamente en el teclado; esto responderá automáticamente la preguntagzip: archive/foo.gz already exists; do you wish to overwrite (y or n)?
En general, creo que es mejor no intentar comprimir los archivos si existe el archivo comprimido correspondiente; mi solución es más ruidosa, pero se ajusta a mis necesidades particulares de un reemplazo directo para el
gzip
comando, ubicado en un archivo de configuración.fuente
gzip
sale2