안녕하세요 여러분, 이 코드에 대해 질문이 있습니다.
for dir in ~/Documents/CMDsh/*/ # list directories in the form "/tmp/dirname/"
do
countFolder=$((countFolder+1));
#echo $dir; #res: /home/arutosio/Documents/CMDsh/20060 Little Non - Hanamaru Sensation (TV Size)/
dir=${dir%*/};#remove the trailing "/" #res: /home/arutosio/Documents/CMDsh/20060 Little Non - Hanamaru Sensation (TV Size)
nameFolder=${dir##*/}; #print everything after the final "/" #res: 20060 Little Non - Hanamaru Sensation (TV Size)
pathNameFolder="$(echo $nameFolder | sed 's/ /\\ /g')"; #res: 20060\ Little\ Non\ -\ Hanamaru\ Sensation\ (TV\ Size)
pathNameFolder="$(echo $pathNameFolder | sed 's/(/\\(/g')"; #res: 20060\ Little\ Non\ -\ Hanamaru\ Sensation\ \(TV\ Size)
pathNameFolder="$(echo $pathNameFolder | sed 's/)/\\)/g')"; #res: 20060\ Little\ Non\ -\ Hanamaru\ Sensation\ \(TV\ Size\)
echo "NumFolder: $countFolder Creating... \"$nameFolder.osz\""; # print everything after the final "/"
echo "zip -r -j -9 ~/osuLazerBeatmap/$pathNameFolder.zip $pathNameFolder/*"; #res: >
#zip -r -j -9 ~/osuLazerBeatmap/20060\ Little\ Non\ -\ Hanamaru\ Sensation\ \(TV\ Size\).zip 20060\ Little\ Non\ -\ Hanamaru\ Sensation\ \(TV\ Size\)/*
zip -r -j -9 ~/osuLazerBeatmap/$pathNameFolder.zip $pathNameFolder/*;
echo '------------------------------';
done
하지만 sh를 실행하면 다음 줄이 나옵니다.
zip -r -j -9 ~/osuLazerBeatmap/$pathNameFolder.zip $pathNameFolder/*;
다음 오류가 발생합니다. zip 오류: 잘못된 명령 인수(짧은 옵션 '\'는 지원되지 않음) 터미널에서 이 줄의 결과를 실행해 보았는데 작동 중입니다. zip -r -j -9 ~/osuLazerBeatmap/20060\small \non\ -\ 하나마루\ 센세이션\(TV\ 사이즈).zip 20060\ 리틀\ 논\ -\ 하나마루\ 센세이션\(TV\ 사이즈)/*
답변1
노력하다:
for dir in ~/Documents/CMDsh/*/
do
countFolder=$((countFolder+1))
dir=${dir%*/}
nameFolder=${dir##*/}
zip -r -j -9 ~/osuLazerBeatmap/"$nameFolder".zip "$dir"/*
echo '------------------------------';
done
노트:
쉘 변수에 대한 참조는 항상 큰따옴표로 묶으십시오. 이 경우 이는 다음을 교체하는 것을 의미합니다.
zip -r -j -9 ~/osuLazerBeatmap/$nameFolder.zip $dir/*
그리고
zip -r -j -9 ~/osuLazerBeatmap/"$nameFolder".zip "$dir"/*
이렇게 하면 세 줄의 sed 코드를 사용하여 이스케이프를 시도할 필요가 없습니다.
이 규칙의 유일한 예외는 명시적으로 원하는 경우입니다.분사또는경로명 확장.
예제가 도움이 될 수 있습니다. 하나의 파일이 포함된 디렉터리의 간단한 예를 살펴보겠습니다.
$ ls Sensation (TV Size)
쉘 변수를 생성해 봅시다:
$ f='Sensation (TV Size)'
이제 따옴표 없이 쉘 변수를 사용해 보겠습니다.
$ ls $f ls: cannot access 'Sensation': No such file or directory ls: cannot access '(TV': No such file or directory ls: cannot access 'Size)': No such file or directory
쉘 변수를 인용할 때 이는 훨씬 더 잘 작동합니다.
$ ls "$f" Sensation (TV Size)
쉘 변수를 인용하면 이스케이프가 필요하지 않습니다.
쉘은 행의 끝을 명령의 끝으로 처리합니다. 따라서 줄 끝의 세미콜론은 해를 끼치지 않지만 불필요합니다.