루프에서 사용할 때 잘못된 위치에 zip 출력

루프에서 사용할 때 잘못된 위치에 zip 출력

나는 많은 디렉토리를 가지고 있으며 그것들을 모두 압축하고 싶습니다.

$ mkdir -p one two three
$ touch one/one.txt two/two.txt three/three.txt
$ ls -F
one/  three/  two/

나는 사용 zip하고 예상대로 작동합니다.

$ zip -r one.zip one
  adding: one/ (stored 0%)
  adding: one/one.txt (stored 0%)
$ ls -F
one/  one.zip  three/  two/

하지만 zsh를 사용하여 루프에서 사용하면 zip 파일이 다른 곳에 생성됩니다.

$ for dir in */; do
for> echo "$dir";   
for> zip -r "$dir.zip" "$dir";
for> done   
one/
  adding: one/ (stored 0%)
  adding: one/one.txt (stored 0%)
three/
  adding: three/ (stored 0%)
  adding: three/three.txt (stored 0%)
two/
  adding: two/ (stored 0%)
  adding: two/two.txt (stored 0%)
$ find . -name "*.zip"
./three/.zip
./two/.zip
./one/.zip
$ ls -F
one/  three/  two/

나는 다음과 같은 결과를 기대합니다.

$ ls -F
one/  one.zip  three/  three.zip  two/  two.zip

어떻게 되어가나요?

답변1

출력에서 확인할 수 있습니다.

for dir in */; do
for> echo "$dir";   
for> zip -r "$dir.zip" "$dir";
for> done   
one/
[ . . . ]

을 실행 중이므로 for dir in */변수에 후행 슬래시가 포함됩니다. 그래서 당신의 $dir것은 one, 그것은 입니다 one/. 따라서 을 실행하면 zip -r "$dir.zip" "$dir";다음 명령이 실행됩니다.

zip -r "one/.zip" "one";

zip지시 사항을 정확하게 따르는 것도 마찬가지입니다. 나는 당신이 원하는 것이 다음과 같다고 생각합니다.

$ for dir in */; do dir=${dir%/}; echo zip -r "$dir.zip" "$dir"; done
zip -r one.zip one
zip -r three.zip three
zip -r two.zip two

관련 정보