nemo:上下文菜單操作觸發腳本,強制選定的符號連結是相對的
我的目標是能夠右鍵點擊 中的符號連結
nemo
,觸發自定義腳本,強制將連結重寫為相對路徑,如果它碰巧擁有絕對路徑。問題是
DRAG+SHIFT+CTRL
內部硬編碼nemo
以產生絕對路徑的符號連結。當我嘗試遠端訪問文件系統時,這會導致問題。我的問題是我想保留
DRAG+SHIFT+CTRL
手勢,我不想nemo
從原始碼建構,我希望能夠遠端瀏覽任意數量的不相關連結的目錄。我提出的解決方案是在其中創建一個新的上下文菜單選項,
nemo
這將允許我通過觸發腳本來“修復”這些連結中的任何一個。通過使用GitHub 上的模板
.nemo_action
創建一個新文件,我已經成功創建了上下文菜單選項。這些類型的文件有兩個目錄:
/usr/share/nemo/actions/
用於系統範圍的操作$HOME/.local/share/nemo/actions/
用於使用者操作我的
fix-link.nemo_action
文件如下:[Nemo Action] Active=true Name=Force Relative Link Comment=If the file is a link to an absolute path, it will be forced to become relative. Exec=<fix-link.sh %F> Selection=any Extensions=nodirs; EscapeSpaces=true
我的
fix-link.sh
文件(在同一目錄中)如下:#!/bin/bash $(ln "-rs" $(readlink -f "$1") "$1.tmp") mv -f "$1.tmp" $(readlink -f "$1") exit 0
我的臨時文件創建得很好,但它拒絕覆蓋
$(readlink -f "$1")
. 我認為這可能與nemo
我最初DRAG+SHIFT+CTRLl
創建絕對路徑連結時設置的權限有關。編輯
@Gilles 修復了我的腳本中的許多錯誤,當時我發現我還需要將文件中的
Extensions=nodirs;
行更改fix-link.nemo_action
為 readExtensions=any;
,否則我將無法通過上下文菜單啟動此腳本,甚至連結到一個目錄,這就是這個東西的全部目的。所以現在
fix-link.nemo_action
如下:[Nemo Action] Active=true Name=Force Relative Link Comment=If the file is a link to an absolute path, it will be forced to become relative. Exec=<fix-link.sh %F> Selection=any Extensions=any; EscapeSpaces=true
我的
fix-link.sh
文件如下:#!/bin/bash ln -rs -- "$(readlink -f -- "$1")" "$1.tmp" mv -f -- "$1.tmp" "$1"
世界上一切都很好。謝謝大家。
您的腳本有幾個問題。
- 周圍缺少雙引號
$(readlink …)
。如果連結目標包含空格或萬用字元,這將中斷。- 您在命令周圍使用命令替換
ln
,並將結果用作要執行的命令。幸運的是,這並沒有什麼害處,因為不會ln
產生任何輸出。- 您的
mv
命令將符號連結移動到目標位置,這沒有任何意義。我想這就是你要寫的:
#!/bin/sh ln -rs -- "$(readlink -f -- "$1")" "$1.tmp" mv -f -- "$1.tmp" "$1"
或者,您可以使用
symlinks
許多 Linux 發行版中存在的實用程序(最初由 Mark Lords 編寫,現在由 J. Brandt Buckley 維護)。該命令symlinks -c /path/to/directory
將指定目錄中的所有符號連結轉換為相對連結。