我如何在我的Linux文件系统中使用attr命令

692 阅读5分钟

我使用开放源码的XFS文件系统是因为扩展属性的微妙便利。扩展属性是一种独特的方式,可以为我的数据添加上下文。

Why the operating system matters even more in 2017

文件系统这个术语是一个花哨的词,用来描述你的计算机如何跟踪你创建的所有文件。无论是办公文件、配置文件,还是数以千计的数码照片,你的电脑都必须以一种对你和它都有用的方式存储大量的数据。像Ext4、XFS、JFS、BtrFS等文件系统是你的计算机用来跟踪数据的 "语言"。

你的桌面或终端可以做很多事情来帮助你快速找到你的数据。例如,你的文件管理器可能有一个过滤功能,这样你就可以迅速看到你的主目录中的图像文件,或者它可能有一个搜索功能,可以通过文件名找到一个文件,等等。这些品质被称为文件属性,因为它们正是如此。数据对象的属性,由文件头和文件系统本身的代码定义。大多数文件系统记录了标准的文件属性,如文件名、文件大小、文件类型、创建时间的时间戳,以及最后一次访问的时间戳。

我在我的电脑上使用开源的XFS文件系统,不是因为它的可靠性和高性能,而是因为扩展属性的微妙便利。

常见的文件属性

当你保存一个文件时,关于它的数据也会一起保存。常见的属性告诉你的操作系统是否要更新访问时间,何时将文件中的数据同步回磁盘,以及其他后勤细节。哪些属性被保存取决于底层文件系统的能力和特点。

除了标准文件属性(只要有标准属性),XFS、Ext4和BtrFS文件系统都可以使用扩展文件系统。

扩展属性

XFS、Ext4和BtrFS允许你创建你自己的任意的文件属性。因为你在编造属性,你的操作系统中没有任何东西可以利用它们,但我把它们作为文件的 "标签",就像我在照片上使用EXIF数据一样。开发人员可能会选择使用扩展属性来开发应用程序中的自定义功能。

XFS中的属性有两个 "命名空间":用户。当创建一个属性时,你必须将你的属性添加到这些命名空间中的一个。要把一个属性添加到命名空间,你必须使用sudo 命令或以根身份登录。

添加一个属性

你可以用attrsetfattr 命令向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

列出扩展文件属性

使用attrgetfattr 命令来查看你已经添加到文件中的扩展属性。attr 命令默认为用户命名空间,并使用-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"

任何扩展的文件属性都可以用attrsetfattr 来更新,就像你在创建该属性一样。

$ 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/

不管你使用什么工具,如果你把文件转移到一个不知道如何处理扩展属性的文件系统,这些属性就会被丢掉。

搜索属性

与扩展属性互动的机制并不多,所以使用你所添加的文件属性的选项是有限的。我使用扩展属性作为一种标签机制,它允许我将那些没有明显关系的文件联系起来。例如,假设我需要为我正在进行的一个项目提供一个知识共享的图形。假设我有先见之明,将扩展属性许可添加到我的图形集合中。我可以用findgetfattr 一起搜索我的图形文件夹。

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"

你的文件系统的秘密

文件系统通常不是你要注意的东西。它们是字面上的系统,用于定义一个文件。这不是计算机执行的最令人兴奋的任务,也不是用户应该关注的东西。但有些文件系统给你一些有趣的、安全的、特殊的能力,扩展的文件属性就是一个很好的例子。它的使用可能是有限的,但扩展属性是一种独特的方式,可以为你的数据添加背景。