어디에서나 상대 디렉터리를 보존하면서 압축

어디에서나 상대 디렉터리를 보존하면서 압축

에서 특정 기능을 얻으려고 합니다 zip. 특정 디렉터리에 모든 것을 재귀적으로 압축하고 해당 디렉터리 내의 디렉터리 구조를 보존하고 싶지만 정규화된 경로가 아카이브의 일부가 되도록 하고 싶지는 않습니다.

내가 가지고 있고 해당 폴더 내에서 명령을 실행하는 것처럼 /path/to/test/tmp/모든 내용을 압축하고 싶다고 가정해 보겠습니다 .tmp/

플래그 -r는 내가 원하는 것을 가져오지만 실행 위치에 따라 필요한 디렉터리 위의 경로 정보를 포함합니다.

user@MBP:~/path/to/test$ zip -r myarchive.zip tmp/
  adding: tmp/foo.txt (deflated 68%)
  adding: tmp/bar/bar.txt (deflated 41%)
  adding: tmp/baz/baz/baz.txt (deflated 92%)

플래그 -j는 파일 이름을 제외한 모든 것을 잘라냅니다.

user@MBP:~/path/to/test$ zip -rj myarchive.zip tmp/
  adding: foo.txt (deflated 68%)
  adding: bar.txt (deflated 41%)
  adding: baz.txt (deflated 92%)

나에게 필요한 것은 다음과 같은 결과를 제공하는 것입니다.

adding: foo.txt (deflated 68%)
adding: bar/bar.txt (deflated 41%)
adding: baz/baz/baz.txt (deflated 92%)

하지만 어디에서나 실행되도록 지정할 수 있습니다. 나는 이것을 cron으로 스크립트하려고합니다. 내가 찾고 있는 것을 찾을 수 없습니다.매뉴얼 페이지. 스크립트에서 디렉토리를 실제로 변경하는 것 외에 어떻게 이를 수행할 수 있습니까?

답변1

zip(적어도 내 플랫폼에 있는 Info-ZIP 버전에서는) 그렇게 하는 것을 허용하지 않는 것 같습니다 . ( @Xen2050이 암시한 것처럼 / 옵션이 tar있는 와는 다릅니다 .)-C--directory

하지만 묻고 싶습니다. 스크립트에서 디렉터리를 변경하는 것이 그렇게 나쁜가요? 특히 서브셸에서 그렇게 할 수 있고 스크립트의 현재 작업 디렉터리에 영향을 주지 않는 경우(자세히 설명됨)이 SO 답변에서):

pwd
(cd /path/to/test/tmp; zip -r myarchive.zip .)
pwd    # prints the same as in line 1

최종 Zip 파일은 /path/to/test/tmp.

관련 정보