在 Linux 文件系統(tǒng)中使用 attr 添加擴(kuò)展屬性

“文件系統(tǒng)” 是一個(gè)描述你的計(jì)算機(jī)怎樣跟蹤你創(chuàng)建的所有文件的完美詞語(yǔ)。你的計(jì)算機(jī)存儲(chǔ)有大量的數(shù)據(jù),無(wú)論是文檔、配置文件還是數(shù)以千計(jì)的照片。這需要一種對(duì)人和機(jī)器都友好的方式。諸如 Ext4、XFS、JFS、BtrFS 的文件系統(tǒng)是你的計(jì)算機(jī)用來(lái)跟蹤文件的“語(yǔ)言”。
你的桌面或終端可以幫助你快速查找文件。例如,你的文件管理器可能有過(guò)濾功能,以便讓你可以快速查看家目錄內(nèi)的圖片,它也可能帶有搜索功能以讓你使用文件名定位文件。這些特性被稱(chēng)作文件屬性,正如其名,它們是由文件頭或者文件系統(tǒng)代碼定義的文件對(duì)象的屬性。大多數(shù)的文件系統(tǒng)記錄了標(biāo)準(zhǔn)的文件屬性,例如文件名、文件大小、文件類(lèi)型、創(chuàng)建時(shí)間、上次訪問(wèn)時(shí)間等。
我在我的計(jì)算機(jī)上使用開(kāi)源的 XFS 文件系統(tǒng),不是為了其穩(wěn)定性和高性能,而是為了其擴(kuò)展屬性帶來(lái)的小小便利。
常見(jiàn)的文件屬性
當(dāng)你保存一個(gè)文件,文件相關(guān)的數(shù)據(jù)也會(huì)隨同保存。常見(jiàn)的屬性會(huì)告訴操作系統(tǒng)是否更新訪問(wèn)時(shí)間,什么時(shí)間同步數(shù)據(jù)到硬盤(pán)等邏輯細(xì)節(jié)。哪些屬性被保存取決于底層文件系統(tǒng)的功能和特性。
在標(biāo)準(zhǔn)文件屬性(如果有標(biāo)準(zhǔn)屬性的話)之外,XFS、Ext4 和 BtrFS 文件系統(tǒng)都可以使用擴(kuò)展屬性。
擴(kuò)展屬性
XFS、Ext4 和 BtrFs 允許你創(chuàng)建自己的任意文件屬性。由于是自己創(chuàng)建的,操作系統(tǒng)不會(huì)有內(nèi)建支持,不過(guò)我以“標(biāo)簽”的方式使用它們,就像圖片的 EXIF 數(shù)據(jù)一樣。開(kāi)發(fā)者們也許會(huì)選擇使用擴(kuò)展屬性去開(kāi)發(fā)應(yīng)用內(nèi)的自定義的功能。
XFS 中的屬性有兩個(gè)“命名空間”:用戶(hù)(user)和根(root)。當(dāng)創(chuàng)建屬性時(shí),你必須將其加入其中一個(gè)命名空間。要將屬性添加到根命名空間,必須使用 sudo 命令或以 root 身份登錄。
增加一個(gè)屬性
你可以使用 attr 和 setfattr 命令在 XFS 文件系統(tǒng)中為文件增加屬性。
attr 命令默認(rèn)在 user 命名空間下進(jìn)行,所以你只需要為屬性設(shè)置一個(gè)名字(-s)和值(-V)。
$ attr -s flavor -V vanilla example.txt
Attribute "flavor" set to a 7 byte value for example.txt:
vanillasetfattr 命令需要你指定目標(biāo)命名空間:
$ setfattr --name user.flavor --value chocolate example.txt列出擴(kuò)展文件屬性
使用 attr 或者 getfattr 命令可以看已添加到文件上的擴(kuò)展屬性。attr 命令默認(rèn)使用 user 空間,使用 -g 以獲取擴(kuò)展屬性:
$ attr -g flavor example.txt
Attribute "flavor" had a 9 byte value for example.txt:
chocolategetfattr 命令需要屬性的命名空間和名字:
$ getfattr --name user.flavor example.txt
# file: example.txt
user.flavor="chocolate"列出所有擴(kuò)展屬性
要看一個(gè)文件的所有擴(kuò)展屬性,你可以使用 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"擴(kuò)展文件屬性可以使用 attr 和 setfattr 更新,就像你創(chuàng)建這些屬性一樣:
$ setfattr --name user.flavor --value strawberry example.txt
$ getfattr -d example.txt
# file: example.txt
user.flavor="strawberry"
user.md5sum="969181e76237567018e14fe1448dfd11"其他文件系統(tǒng)上的屬性
使用擴(kuò)展屬性最大的風(fēng)險(xiǎn)是忘記這些屬性是特定于某個(gè)文件系統(tǒng)的。這意味著當(dāng)你從一個(gè)磁盤(pán)或分區(qū)復(fù)制文件到另外一個(gè)磁盤(pán)或分區(qū)時(shí),這些屬性都會(huì)丟失,即使目標(biāo)位置的文件系統(tǒng)也支持?jǐn)U展屬性。
為了避免丟失擴(kuò)展屬性,你需要使用支持保留這些屬性的工具,例如 rsync 命令。
$ rsync --archive --xattrs ~/example.txt /tmp/但無(wú)論你使用什么工具,如果你傳輸文件到一個(gè)不知道如何處理擴(kuò)展屬性的文件系統(tǒng),這些屬性都會(huì)被丟棄。
搜索屬性
與擴(kuò)展屬性交互的機(jī)制并不多,所以使用這些添加的文件屬性的方法也有限。我使用擴(kuò)展屬性作為標(biāo)簽機(jī)制,這讓我可以將沒(méi)有明顯關(guān)系的文件聯(lián)系起來(lái)。例如,假設(shè)我需要在一個(gè)項(xiàng)目中用“知識(shí)共享”的圖形。假如我預(yù)見(jiàn)性地將 license 屬性添加到了我的圖形庫(kù)中,我就可以使用 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"文件系統(tǒng)的秘密
文件系統(tǒng)一般不會(huì)引起你的注意。它們實(shí)際是定義文件的系統(tǒng)。這不是計(jì)算機(jī)做的最讓人興奮的任務(wù),也不是用戶(hù)應(yīng)該關(guān)心的東西。但是有些文件系統(tǒng)可以給你有趣、安全的特殊能力,擴(kuò)展文件屬性就是一個(gè)好例子。它的用途可能有限,但是擴(kuò)展屬性是你為數(shù)據(jù)增加上下文的獨(dú)特方法。




















