나는 많은 디렉토리를 가지고 있으며 그것들을 모두 압축하고 싶습니다.
$ 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