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

    これにより、3行のsedコードを使用してエスケープしようとする必要がなくなります。

    このルールの唯一の例外は、明示的に必要な場合です。噴射またはパス名拡張

  2. 例は役に立ちます。 1つのファイルを含むディレクトリの簡単な例を見てみましょう。

    $ 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. シェルは行の終わりをコマンドの終わりとして扱います。したがって、行末のセミコロンは害を及ぼすことはありませんが、不要です。

関連情報