こんにちは私はこのコードに問題があります:
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)/ *
試してください:
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"/*
これにより、3行のsedコードでエスケープを試みる必要がなくなります。
このルールの唯一の例外は、明示的にWord分割またはパス名展開が必要な場合です。
例が役立つかもしれません。ファイルが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変数を引用することで、エスケープは必要ありません。
シェルは行の終わりをコマンドの終わりとして扱います。したがって、行末のセミコロンは問題ありませんが、不要です。