nemoファイルマネージャにカスタムアクションを追加しようとしています。このタスクの目的は、単にファイル名のすべてのスペースを「_」に置き換えることです。私の作業ファイルは次のとおりです。
[Nemo Action]
Name=Normalize
Comment=replace all occurences of " " by "_"
Exec=<normalize.sh %F>
Selection=Any
Extensions=Any
Bash スクリプト Normalize.sh は、次のように actions ディレクトリにあります。
#!/usr/bin/bash
if [[ "$#" != 1 ]]
then exit 1
fi
name=`echo "$1" | sed "s/\ /\_/g"`
mv "$1" "$name"
exit 0
なぜこれがうまくいかないのか知っている人はいますか?
答え1
質問:
問題は非常にマイナーです。つまり%F
、ファイル名でファイル名にスペースが含まれているので、次のようにスクリプトを呼び出します。
normalize.sh my fancy file
だからそれは$1
なったmy
、$2
なったfancy
、$3
なったfile
。これで$#
3になりました。
修正1(推奨):
この問題を解決するには。パラメータの数を確認する必要はありません。これで$@
代わりに使用できます$1
。スクリプトは次のとおりです。
#!/usr/bin/bash
name=`echo "$@" | sed "s/\ /\_/g"`
mv "$@" "$name"
exit 0
修正2:
別の解決策は、周囲に引用符を付けることです%F
。正しいコードは次のとおりです。
[Nemo Action]
Name=Normalize
Comment=replace all occurences of " " by "_"
Exec=<normalize.sh "%F">
Selection=Any
Extensions=Any
拡張スクリプト:
#!/usr/bin/env bash
mv "$@" "$(tr ' ' '_' <<< "$@")"
exit 0
- 通常はオンに
bash
なっています/bin/bash
。あなたが開いているようだから/usr/bin/bash
(最初に見たことがある)、bashがどこにいても実行できる一般的なwhich bash
回避策を設定しました。ただし、端末でbashに入力されたパスを表示できます。 - パラメータ計算条件を削除しました。
sed
既存のものを使用する理由は何ですかtr
?echo
ファイルsed
やをtr
使用する代わりに<<<
。- すべてを一行に入れたらどうでしょうか?