有沒有一種快速簡單的方法在 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
.