Linux zip e excluir o diretório no script Bash

0

Estou tentando escrever um script bash / shell para fechar uma pasta específica e ignorar determinadas sub-pastas nessa pasta.

Esta é a pasta que estou tentando zipar " sync_test5 ":

Meuscriptbashgeraumalistadeignorados( com base 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, no entanto, é não ignorando / excluindo os diretórios que eu especifiquei.

Então, eu mandei o shell script gerar o comando que ele tentou executar, que era:

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 em massa assim, ele funciona:

Então, por que meu script de shell não funciona da maneira pretendida? o comando que está sendo executado é idêntico (no shell e na massa diretamente).

    
por Latheesan 12.08.2014 / 13:40

2 respostas

0

Não consigo ver o que você está tentando alcançar com "**\*" na lista de exclusões, mas, conforme o li, -x exclui arquivos cujos nomes correspondem a um padrão e não leva em conta os diretórios onde eles residem.

A forma 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.

    
por 12.08.2014 / 14:21
0

De acordo com essa resposta, link , 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 fugir com o asterisco para que, quando for substituído na linha de comando, ele escape.

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

Mas para cada um deles. O que você quer é o comando para se parecer com um dos abaixo quando é executado através 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 o zip e não há globalização de arquivo na linha de comando.

    
por 13.08.2014 / 22:15