Estou tentando escrever um script bash/shell para compactar uma pasta específica e ignorar determinados subdiretórios nessa pasta.
Esta é a pasta que estou tentando compactar"sincronização_test5":
Meu script bash gera uma lista de ignorados (baseado em) e chama a função zip assim:
#!/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"
Agora este script é executado sem erros, porém énãoignorando/excluindo os diretórios que especifiquei.
Então, fiz com que o shell script gerasse o comando que ele tentou executar, que foi:
zip -r 12-08-2014_072810.website.zip sync_test5 -x sync_test5/dir_to_ignore/**\* sync_test5/dir2_to_ignore/**\*
Agora, se eu executar o comando acima diretamente no PuTTY assim, ele funcionará:
Então, por que meu script de shell não exclui o funcionamento conforme pretendido? o comando que está sendo executado é idêntico (diretamente no shell e no putty).
Responder1
Não consigo ver o que você está tentando alcançar "**\*"
na lista de exclusões, mas, pelo que li, -x exclui arquivos cujos nomes correspondem a um padrão e não leva em consideração os diretórios onde eles residem.
A maneira mais simples de excluir diretórios é remover temporariamente a permissão de execução deles, por exemplo: -
chmod -x ...
zip ...
chmod +x ...
Apenas certifique-se de restaurar a permissão de execução se você abortar o script por qualquer motivo.
Responder2
De acordo com esta resposta,https://superuser.com/a/496903/356580, você precisa de 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
Você também pode fazer um escape sofisticado com o asterisco para que, quando ele for substituído na linha de comando, ele seja escapado, por exemplo
ignorelist="$ignorelist $SYNC_WEB_ROOT_BACKUP_DIR/$ignoredir/\\*"
Mas cada um na sua. O que você deseja é que o comando se pareça com um dos itens abaixo quando for executado por meio da substituição:
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/*"
Dessa forma, o caractere asterix é enviado para zip e não há nenhum arquivo globing na linha de comando.