bash zip 오류: 잘못된 명령 인수(짧은 옵션 '\'는 지원되지 않음)

bash zip 오류: 잘못된 명령 인수(짧은 옵션 '\'는 지원되지 않음)

안녕하세요 여러분, 이 코드에 대해 질문이 있습니다.

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

노트:

  1. 쉘 변수에 대한 참조는 항상 큰따옴표로 묶으십시오. 이 경우 이는 다음을 교체하는 것을 의미합니다.

    zip -r -j -9 ~/osuLazerBeatmap/$nameFolder.zip $dir/*
    

    그리고

    zip -r -j -9 ~/osuLazerBeatmap/"$nameFolder".zip "$dir"/*
    

    이렇게 하면 세 줄의 sed 코드를 사용하여 이스케이프를 시도할 필요가 없습니다.

    이 규칙의 유일한 예외는 명시적으로 원하는 경우입니다.분사또는경로명 확장.

  2. 예제가 도움이 될 수 있습니다. 하나의 파일이 포함된 디렉터리의 간단한 예를 살펴보겠습니다.

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

    쉘 변수를 인용하면 이스케이프가 필요하지 않습니다.

  3. 쉘은 행의 끝을 명령의 끝으로 처리합니다. 따라서 줄 끝의 세미콜론은 해를 끼치지 않지만 불필요합니다.

관련 정보