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

recursive -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)

관련 정보