Bash

nemo:上下文菜單操作觸發腳本,強制選定的符號連結是相對的

  • August 10, 2015

我的目標是能夠右鍵點擊 中的符號連結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為 read Extensions=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將指定目錄中的所有符號連結轉換為相對連結。

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