zip의 -x 제외 옵션이 실제로 경로를 제외하지 않는 이유는 무엇입니까?

zip의 -x 제외 옵션이 실제로 경로를 제외하지 않는 이유는 무엇입니까?

Raspberry Pi에서 Raspbian을 사용하여 /etc 파일을 백업하고 싶지만 전부는 아닙니다. /etc/alternatives를 제외하고 싶기 때문에 다음 명령을 사용했습니다.

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

왜 이것이 작동하지 않습니까? /etc의 다른 모든 폴더와 마찬가지로 /etc/alternatives의 내용을 포함합니다.

이러한 변형을 시도했지만 역시 작동하지 않았습니다.

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/*'

재귀를 위한 -r 옵션에서 zip -h2 도움말에 "경로를 포함하거나 제외하려면 -i 및 -x를 사용하십시오"라고 표시되므로 내가 하려는 작업이 지원되어야 하는 것 같습니다.

답변1

문제는 "x"("-x" 옵션의 경우) 앞의 "-"가 실제로 OP 질문의 ASCII 빼기 기호가 아니라는 것입니다. 대신 유니코드 u+2013입니다(동일해 보이지만 동일하게 작동하지 않음).

명령을 예상대로 입력하면 OP의 마지막 예에서 예상대로 작동합니다(여기에서 수정됨).

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

아마도 이는 일부 웹사이트에서 잘라내기/붙여넣기로 인해 발생한 문제였을 것입니다.

추가 자료:

답변2

페이지 에서 man zip:

zip -r foo foo -x \*.o

이는 foo.zip에 foo의 내용을 포함하고 .o로 끝나는 모든 파일을 제외합니다. 백슬래시는 쉘 파일 이름 대체를 방지하므로 모든 디렉토리 수준에서 zip을 통해 이름 일치가 수행됩니다.

*glob이 쉘이 아니라 유틸리티 자체로 확장되었는지 확인해야 합니다. zip그렇지 않으면 /etc/alternatives 디렉토리의 파일에만 직접 영향을 미치고 하위 디렉토리를 대상으로 하지 않습니다. 앞에 백슬래시를 추가하거나 *인용하면 됩니다.

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

그러나 이미 비슷한 방법을 시도한 것 같습니다. 이 방법이 효과가 있어야 하는데 왜 효과가 없는지 명확하지 않습니다. 그러나 유틸리티를 호출하기 전에 추가 도구를 사용하여 원하지 않는 파일을 제외하는 등 비슷한 효과를 얻을 수 있는 다른 방법이 있습니다 zip.

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

관련 정보