Reutilizar indicadores similares para múltiples comandos

Reutilizar indicadores similares para múltiples comandos

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 --excludeindicadores 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 tarexcluye 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 bashla expansión del historial:

  • !!consulte el último comando
  • 3-$consulte el tercer parámetro hasta el último

Debe activar bashlas 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/oneque 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.

información relacionada