在 bash 中描述/標記檔案的簡單方法

在 bash 中描述/標記檔案的簡單方法

有沒有一種快速簡單的方法在 bash 中標記文件,以便像這樣的列表

-rw------- 1 root   88039 Sep 29 16:31 7CCE2EC3-3191-4379-C036-1C48CCCE4C6C
-rw------- 1 root 1985554 Sep 27 16:09 61C6DCDC-04C6-5137-8894-2C8930251D1E
-rw------- 1 root  248965 Sep 26 14:12 22384DC7-D60E-57CC-94C2-C5301C980990
-rw------- 1 root  293908 Sep 22 18:27 C14E6C74-C301-49CC-C625-070721CC47C1
-rw------- 1 root  120965 Sep 19 19:17 2407C1C5-D09C-41E1-9080-C2CC8C86D0CC
-rw------- 1 root   20036 Sep 13 18:32 78691D77-C4E6-4ED1-8119-C09CCC194892
-rw------- 1 root   11789 Sep 12 23:16 8C8C190C-5340-421C-96D1-D4111C5E062C
-rw------- 1 root    1884 Sep 11 22:07 CCC91959-9744-4339-9C99-0C75E301090C

變成這樣(或類似)

-rw------- 1 root   88039 Sep 29 16:31 7CCE2EC3-3191-4379-C036-1C48CCCE4C6C
-rw------- 1 root 1985554 Sep 27 16:09 61C6DCDC-04C6-5137-8894-2C8930251D1E
-rw------- 1 root  248965 Sep 26 14:12 22384DC7-D60E-57CC-94C2-C5301C980990 -> MYOLDFILE1
-rw------- 1 root  293908 Sep 22 18:27 C14E6C74-C301-49CC-C625-070721CC47C1
-rw------- 1 root  120965 Sep 19 19:17 2407C1C5-D09C-41E1-9080-C2CC8C86D0CC -> MYNEWFILE.TXT
-rw------- 1 root   20036 Sep 13 18:32 78691D77-C4E6-4ED1-8119-C09CCC194892
-rw------- 1 root   11789 Sep 12 23:16 8C8C190C-5340-421C-96D1-D4111C5E062C -> hello.c
-rw------- 1 root    1884 Sep 11 22:07 CCC91959-9744-4339-9C99-0C75E301090C

我嘗試做一些事情ln -s,但最終我得到了很多重複項,因為鏈接位於同一目錄中,為了獲得更好的視圖,我必須使用 grep 過濾 ls ..感謝任何幫助

答案1

我認為您不能可靠地(錯誤地)使用任何可用的功能來定期ls(有或沒有選項)做您想做的事情。您需要ls使用腳本、函數或別名來重新定義。

我不會重新定義ls自己,至少在這個例子中不會,這意味著一個簡單的概念證明。支援命令列開關ls會使範例過於複雜。

要實現我的解決方案,您需要一個支援擴充屬性的檔案系統和操作它們的工具(例如apt-get install attr在 Debian 中)。

設定屬性:

setfattr -n user.mytag -v "hello.c" "8C8C190C-5340-421C-96D1-D4111C5E062C"

註:mytag是任意名稱。選擇一項並堅持下去。

若要刪除該屬性:

setfattr -x user.mytag "8C8C190C-5340-421C-96D1-D4111C5E062C"

您可以建立自訂腳本或函數來以更方便的方式完成這些操作。現在假設您選擇ll做您想做的事。如果是別名,則需要先取消別名:

unalias ll

然後定義一個函數:

function ll() { find "$@" -maxdepth 1 -exec \
   sh -c '
      a=$(getfattr -n user.mytag --only-values "$1" 2>/dev/null)
      ls -dalF -- "$1" | tr -d "\n"
      if [ -z "$a" ]; then printf "\n"; else printf " => %s\n" "$a"; fi
   ' sh {} \;
}

用法範例:

ll   # but see notes below
ll 8C8C190C-5340-421C-96D1-D4111C5E062C
ll /bin
ll foo.txt bar.txt

輸出範例:

-rw------- 1 root root 11789 Sep 12 23:16 8C8C190C-5340-421C-96D1-D4111C5E062C => hello.c

筆記:

  • 我使用了=>, not ->,因為後者已經被用於ls符號連結。
  • POSIX 需要至少一個find呼叫路徑。唯一ll(不帶參數)可能會導致find失敗(比較這個答案)。如果是這樣,您將需要一些初步邏輯來傳遞.find.
  • -maxdepth也不是 POSIX。如果您無法使用它,請參閱這個問題
  • 該函數只是將其所有參數傳遞給find(as "$@")。這意味著此自訂ll不理解通常使用的選項ls(或常見ll別名)。另一方面,注入測試find是可能的。
  • 名稱或標籤中的特殊或不可列印字元可能會導致意外輸出。
  • ls -dalF分別為每個物件調用,因此產生的行可能不會與常規列對齊。考慮採取-printf行動,而不是ls列印您需要的所有資訊,但仍需要的標籤除外getfattr。在格式中使用製表符作為分隔符號-printf將對多行輸出進行列化(至少以某種方式)。請注意,如果格式正確,-printf您將不需要tr.

相關內容