在 Linux 文件系統中使用 attr 添加擴展屬性
我使用開源的 XFS 文件系統是為了其擴展屬性帶來的小小便利。擴展屬性是一種為我的數據添加上下文的獨特方式。
「文件系統」 是一個描述你的計算機怎樣跟蹤你創建的所有文件的完美詞語。你的計算機存儲有大量的數據,無論是文檔、配置文件還是數以千計的照片。這需要一種對人和機器都友好的方式。諸如 Ext4、XFS、JFS、BtrFS 的文件系統是你的計算機用來跟蹤文件的「語言」。
你的桌面或終端可以幫助你快速查找文件。例如,你的文件管理器可能有過濾功能,以便讓你可以快速查看家目錄內的圖片,它也可能帶有搜索功能以讓你使用文件名定位文件。這些特性被稱作文件屬性,正如其名,它們是由文件頭或者文件系統代碼定義的文件對象的屬性。大多數的文件系統記錄了標準的文件屬性,例如文件名、文件大小、文件類型、創建時間、上次訪問時間等。
我在我的計算機上使用開源的 XFS 文件系統,不是為了其穩定性和高性能,而是為了其擴展屬性帶來的小小便利。
常見的文件屬性
當你保存一個文件,文件相關的數據也會隨同保存。常見的屬性會告訴操作系統是否更新訪問時間,什麼時間同步數據到硬碟等邏輯細節。哪些屬性被保存取決於底層文件系統的功能和特性。
在標準文件屬性(如果有標準屬性的話)之外,XFS、Ext4 和 BtrFS 文件系統都可以使用擴展屬性。
擴展屬性
XFS、Ext4 和 BtrFs 允許你創建自己的任意文件屬性。由於是自己創建的,操作系統不會有內建支持,不過我以「標籤」的方式使用它們,就像圖片的 EXIF 數據一樣。開發者們也許會選擇使用擴展屬性去開發應用內的自定義的功能。
XFS 中的屬性有兩個「命名空間」:用戶(user
)和根(root
)。當創建屬性時,你必須將其加入其中一個命名空間。要將屬性添加到根命名空間,必須使用 sudo
命令或以 root
身份登錄。
增加一個屬性
你可以使用 attr
和 setfattr
命令在 XFS 文件系統中為文件增加屬性。
attr
命令默認在 user
命名空間下進行,所以你只需要為屬性設置一個名字(-s
)和值(-V
)。
$ attr -s flavor -V vanilla example.txt
Attribute "flavor" set to a 7 byte value for example.txt:
vanilla
setfattr
命令需要你指定目標命名空間:
$ setfattr --name user.flavor --value chocolate example.txt
列出擴展文件屬性
使用 attr
或者 getfattr
命令可以看已添加到文件上的擴展屬性。attr
命令默認使用 user
空間,使用 -g
以獲取擴展屬性:
$ attr -g flavor example.txt
Attribute "flavor" had a 9 byte value for example.txt:
chocolate
getfattr
命令需要屬性的命名空間和名字:
$ getfattr --name user.flavor example.txt
# file: example.txt
user.flavor="chocolate"
列出所有擴展屬性
要看一個文件的所有擴展屬性,你可以使用 attr -l
:
$ attr -l example.txt
Attribute "md5sum" has a 32 byte value for example.txt
Attribute "flavor" has a 9 byte value for example.txt
或者,你也可以使用 getfattr -d
:
$ getfattr -d example.txt
# file: example.txt
user.flavor="chocolate"
user.md5sum="969181e76237567018e14fe1448dfd11"
擴展文件屬性可以使用 attr
和 setfattr
更新,就像你創建這些屬性一樣:
$ setfattr --name user.flavor --value strawberry example.txt
$ getfattr -d example.txt
# file: example.txt
user.flavor="strawberry"
user.md5sum="969181e76237567018e14fe1448dfd11"
其他文件系統上的屬性
使用擴展屬性最大的風險是忘記這些屬性是特定於某個文件系統的。這意味著當你從一個磁碟或分區複製文件到另外一個磁碟或分區時,這些屬性都會丟失,即使目標位置的文件系統也支持擴展屬性。
為了避免丟失擴展屬性,你需要使用支持保留這些屬性的工具,例如 rsync
命令。
$ rsync --archive --xattrs ~/example.txt /tmp/
但無論你使用什麼工具,如果你傳輸文件到一個不知道如何處理擴展屬性的文件系統,這些屬性都會被丟棄。
搜索屬性
與擴展屬性交互的機制並不多,所以使用這些添加的文件屬性的方法也有限。我使用擴展屬性作為標籤機制,這讓我可以將沒有明顯關係的文件聯繫起來。例如,假設我需要在一個項目中用「知識共享」的圖形。假如我預見性地將 license
屬性添加到了我的圖形庫中,我就可以使用 find
和 getfattr
在圖形文件夾中尋找:
find ~/Graphics/ -type f
-exec getfattr
--name user.license
-m cc-by-sa {} ; 2>/dev/null
# file: /home/tux/Graphics/Linux/kde-eco-award.png
user.license="cc-by-sa"
user.md5sum="969181e76237567018e14fe1448dfd11"
文件系統的秘密
文件系統一般不會引起你的注意。它們實際是定義文件的系統。這不是計算機做的最讓人興奮的任務,也不是用戶應該關心的東西。但是有些文件系統可以給你有趣、安全的特殊能力,擴展文件屬性就是一個好例子。它的用途可能有限,但是擴展屬性是你為數據增加上下文的獨特方法。
(題圖:MJ/06c0c478-7af7-49e4-836b-a9923db9dc0c)
via: https://opensource.com/article/22/6/linux-attr-command
作者:Seth Kenlon 選題:lkxed 譯者:wznmickey 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive