Bash
自定義 nemo 動作/bash 腳本
我正在嘗試向 nemo 文件管理器添加自定義操作。該操作的目的只是將文件名中的所有空格替換為“_”。我的操作文件如下所示:
[Nemo Action] Name=Normalize Comment=replace all occurences of " " by "_" Exec=<normalize.sh %F> Selection=Any Extensions=Any
bash 腳本 normalize.sh 是操作目錄,如下所示:
#!/usr/bin/bash if [[ "$#" != 1 ]] then exit 1 fi name=`echo "$1" | sed "s/\ /\_/g"` mv "$1" "$name" exit 0
有誰知道,為什麼這不起作用?
問題:
你的問題很~~簡單,~~就是
%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
,更好用<<<
。- 為什麼不把所有東西放在一條線上呢?