Por que a opção -x exclude no zip parece realmente excluir o caminho?

Por que a opção -x exclude no zip parece realmente excluir o caminho?

Usando o Raspbian em um Raspberry Pi, quero fazer backup dos arquivos/etc, mas não de todos eles. Gostaria de excluir /etc/alternatives, então usei este comando:

sudo zip -r /home/pi/backup/$timestamp/etcfilesall.zip /etc/* –x /etc/alternatives/*

Por que isso não funciona? Ele passa a incluir o conteúdo de /etc/alternatives assim como todas as outras pastas em /etc.

Eu tentei essas variações e elas também não funcionaram

sudo zip -r –x /etc/alternatives/* @ /home/pi/backup/$timestamp/etcfilesall.zip /etc/*
sudo zip -r /home/pi/backup/$timestamp/etcfilesall.zip /etc/* –x /etc/alternatives
sudo zip -r /home/pi/backup/$timestamp/etcfilesall.zip /etc/* –x '/etc/alternatives'
sudo zip -r /home/pi/backup/$timestamp/etcfilesall.zip /etc/* –x '/etc/alternatives/*'

Na opção -r para recursão, a ajuda do zip -h2 diz "Use -i e -x para incluir ou excluir caminhos", então parece que o que estou tentando fazer deve ser suportado.

Responder1

O problema é que o "-" antes do "x" (para a opção "-x") não é realmente um sinal de menos ASCII na pergunta do OP. Em vez disso, é o Unicode u+2013 (parece o mesmo, mas não funciona da mesma forma).

Se o comando for digitado conforme o esperado, ele funcionará conforme o esperado no último exemplo do OP (corrigido aqui):

sudo zip -r /home/pi/backup/$timestamp/etcfilesall.zip /etc/* -x '/etc/alternatives/*'

Provavelmente este foi um problema resultante de recortar/colar de algum site.

Leitura adicional:

Responder2

Da man zippágina:

zip -r foo foo -x \*.o

que incluirá o conteúdo de foo em foo.zip, excluindo todos os arquivos que terminam em .o. A barra invertida evita a substituição do nome do arquivo shell, para que a correspondência do nome seja realizada por zip em todos os níveis de diretório.

Você precisa ter certeza de que seu glob *seja expandido não pelo shell, mas pelo zippróprio utilitário, caso contrário, ele afetará apenas os arquivos diretamente no diretório /etc/alternatives e não terá como alvo os subdiretórios. Isso pode ser feito adicionando uma barra invertida antes *ou citando-a:

sudo zip -r /home/pi/backup/$timestamp/etcfilesall.zip /etc/* –x /etc/alternatives/\*

No entanto, parece que você já tentou uma maneira semelhante - não está claro para mim por que não funcionou para você, mas deveria. Ainda assim, existem outras maneiras de obter um efeito semelhante, como usar ferramentas adicionais para excluir arquivos indesejados antes de chamar zipo utilitário:

sudo zip -r /home/pi/backup/$timestamp/etcfilesall.zip $(sudo find /etc | grep -v ^/etc/alternatives)

informação relacionada