Bash

自定義 nemo 動作/bash 腳本

  • April 18, 2015

我正在嘗試向 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文件來sedtr,更好用<<<
  • 為什麼不把所有東西放在一條線上呢?

引用自:https://unix.stackexchange.com/questions/197098