Linux comprime y excluye el directorio en el script Bash

Linux comprime y excluye el directorio en el script Bash

Estoy intentando escribir un script bash/shell para comprimir una carpeta específica e ignorar ciertos subdirectorios en esa carpeta.

Esta es la carpeta que estoy intentando comprimir "prueba_sincronización5":

ingrese la descripción de la imagen aquí

Mi script bash genera una lista de ignorados (Residencia en) y llama a la función zip de esta manera:

#!/bin/bash

SYNC_WEB_ROOT_BASE_DIR="/home/www-data/public_html"
SYNC_WEB_ROOT_BACKUP_DIR="sync_test5"
SYNC_WEB_ROOT_IGNORE_DIR="dir_to_ignore dir2_to_ignore"

ignorelist=""
if [ "$SYNC_WEB_ROOT_IGNORE_DIR" != "" ];
then
    for ignoredir in $SYNC_WEB_ROOT_IGNORE_DIR
    do
        ignorelist="$ignorelist $SYNC_WEB_ROOT_BACKUP_DIR/$ignoredir/**\*"
    done
fi

FILE="$SYNC_BACKUP_DIR/$DATETIMENOW.website.zip"
cd $SYNC_WEB_ROOT_BASE_DIR;
zip -r $FILE $SYNC_WEB_ROOT_BACKUP_DIR -x $ignorelist >/dev/null
echo "Done"

Ahora este script se ejecuta sin errores, sin embargo esnoignorando/excluyendo los directorios que he especificado.

Entonces, hice que el script de shell generara el comando que intentó ejecutar, que era:

zip -r 12-08-2014_072810.website.zip sync_test5 -x  sync_test5/dir_to_ignore/**\* sync_test5/dir2_to_ignore/**\*

Ahora, si ejecuto el comando anterior directamente en PuTTY de esta manera, funciona:

ingrese la descripción de la imagen aquí

Entonces, ¿por qué mi script de shell no excluye el funcionamiento previsto? el comando que se está ejecutando es idéntico (en Shell y PuTTY directamente).

Respuesta1

No veo qué intenta lograr "**\*"en la lista de exclusión, pero según lo leí, -x excluye archivos cuyos nombres coinciden con un patrón y no tiene en cuenta los directorios donde residen.

La forma más sencilla de excluir directorios es eliminarles temporalmente el permiso de ejecución, por ejemplo:

chmod -x ...
zip ...
chmod +x ...

Solo asegúrese de restaurar el permiso de ejecución si cancela el script por cualquier motivo.

Respuesta2

Según esta respuesta,https://superuser.com/a/496903/356580, necesitas algo como:

ignorelist=""
if [ "$SYNC_WEB_ROOT_IGNORE_DIR" != "" ];
then
    for ignoredir in $SYNC_WEB_ROOT_IGNORE_DIR
    do
        ignorelist="$ignorelist \"$SYNC_WEB_ROOT_BACKUP_DIR/$ignoredir/*\""
    done
fi

También puedes hacer un escape elegante con el asterix para que cuando se reemplace en la línea de comando, se escape, por ejemplo

ignorelist="$ignorelist $SYNC_WEB_ROOT_BACKUP_DIR/$ignoredir/\\*"

Pero a cada cual lo suyo. Lo que desea es que el comando se parezca a cualquiera de los siguientes cuando se ejecuta mediante la sustitución:

zip -r sync_test.zip sync_test -x sync_test/dir_to_ignore/\* sync_test/dir2_to_ignore/\*
zip -r sync_test.zip sync_test -x "sync_test/dir_to_ignore/*" "sync_test/dir2_to_ignore/*"

De esta manera, el carácter asterisco se envía al zip y no hay ningún archivo en la línea de comando.

información relacionada