
Digamos que quiero ejecutar varios comandos con indicadores similares, como:
du -sh / --exclude=/dir1 --exclude=/dir2 --exclude=/dir3/dir4
tar cvf archive / --exclude=dir1 --exclude=dir2 --exclude=dir3/dir4
Quiero reutilizar la secuencia de --exclude
indicadores y hacer que el código sea más limpio, por ejemplo, guardando estos indicadores en una variable.
Entonces los comandos anteriores se ven así
du -sh / "$EFLAGS"
tar cvf archive / "$EFLAGS"
Tenga en cuenta que tar
excluye archivos y directorios relativos al directorio dado.
¿Cuál es la mejor y más limpia solución?
Fondo
Quiero hacer una copia de seguridad de mi sistema usando tar y excluir algunos directorios que no necesito.
Respuesta1
Puedes probar esto:
$ echo -e / --exclude=/dir1 --exclude=/dir2 --exclude=/dir3/dir4
/ --exclude=/dir1 --exclude=/dir2 --exclude=/dir3/dir4
$ echo !!:3-$
echo --exclude=/dir1 --exclude=/dir2 --exclude=/dir3/dir4
--exclude=/dir1 --exclude=/dir2 --exclude=/dir3/dir4
Aquí usamos bash
la expansión del historial:
!!
consulte el último comando3-$
consulte el tercer parámetro hasta el último
Debe activar bash
las funciones de expansión del historial en su secuencia de comandos, que están deshabilitadas en el shell no interactivo:
set -o history
set -o histexpand
Respuesta2
En Bash, una forma muy limpia es utilizar matrices:
myflags=( --exclude=/dir1 --exclude=/dir2 --exclude=/dir3/dir4 )
tar cvf archive / "${myflags[@]}"
Pueden manejar espacios y cualquier otro personaje divertido:
myflags=( "--exclude=/a dir/with spaces" $'--exclude=/a dir/with\nnewlines' )
tar cvf archive / "${myflags[@]}"
También se pueden falsificar, por ejemplo, desea excluir todos los subdirectorios del directorio /this/one
que contengan la letra g
:
exclude_dirs=( /this/one/*g* )
myflags=( "${exclude_dirs[@]/#/--exclude=}" )
tar cvf archive / "${myflags[@]}"
Respuesta3
¡Habría agregado esto como comentario, excepto que no he descubierto cómo formatear bien los comentarios!
De todos modos, creo que has recorrido el 90% del camino. Intentar:-
EFLAGS="--exclude=/dir1 --exclude=/dir2"
du -sh / $EFLAGS
tar cvf archive / $EFLAGS
Se necesitan comillas en la primera línea ya que hay espacios involucrados.
Sin comillas al usar la variable para dividir los argumentos en espacios.
Si hay espacios en los nombres de los directorios excluidos, deberá eliminarlos.