web-dev-qa-db-ja.com

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\Little\Non \-\ Hanamaru\Sensation \(TV\Size).Zip 20060\Little\Non \-\ Hanamaru\Sensation \(TV\Size)/ *

2
Stefano Aruta

試してください:

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"/*
    

    これにより、3行のsedコードでエスケープを試みる必要がなくなります。

    このルールの唯一の例外は、明示的にWord分割またはパス名展開が必要な場合です。

  2. 例が役立つかもしれません。ファイルが1つあるディレクトリの簡単な例を考えてみましょう。

    $ ls
    Sensation (TV Size)
    

    シェル変数を作成しましょう:

    $ f='Sensation (TV Size)'
    

    次に、引用符で囲まれていないShell変数を使用してみましょう。

    $ 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
    

    Shell変数が引用符で囲まれていると、それがいかに優れているかに注目してください。

    $ ls "$f"
    Sensation (TV Size)
    

    Shell変数を引用することで、エスケープは必要ありません。

  3. シェルは行の終わりをコマンドの終わりとして扱います。したがって、行末のセミコロンは問題ありませんが、不要です。

3
John1024