查看文件的权限
输入如下命令可以查看文件权限:
# 查看当前目录下的所有文件权限
ls -l
# 查看指定文件的权限
ls -l | grep 文件名
复制代码
文件权限展示的含义
当我们输入上面的命令后,可以看到如下的展示:
上面红框框出的区域依次是:权限、链接数、所有者、所有组、文件大小、最后修改日期、文件名称。
第一个红框内就是我们需要的权限内容,我们解读下这些字母表示的含义:
第一个字符表示的是文件的类型:
i
: 符号链接文件d
: 文件夹-
: 普通文件
后面9个字母表示的是文件的权限:
r
: 有读取的权限w
: 有写入的权限x
: 有执行的权限-
: 没有该权限
其实文件一共分为3个权限,分别是:[read][write][execute]
,这样说的话只要3个字母就行了,之所以要9个字母,是因为要对应的不同身份,一共分为3个身份:
[user]
: 上面红框中的所有者[group]
: 上面红框中所属组的人员[other]
: 不是上面两种人员的其他人
每3个字母表示的对应身份对于该文件的权限,正好9个字母。
改变文件权限
改变文件权限的命令是chmod
,一共有两种形式
数字类型
我们把各个权限设成一个数值:
r
: 4w
: 2x
: 1
如果一个文件权限设为[–rwxr-xr-x],那么各个身份的权限值为:
User
: 4+2+1 = 7Group
: 4+0+1 = 5Other
: 4+0+1 = 5
最后生成的命令为:
chmod 755 文件名
复制代码
符号类型
符号类型的命令为:
chmod [u、g、o、a][+、-、=][r、w、x] 文件名称
复制代码
各个字符的意思:
u
: 用户所有者User
g
: 用户所在组Group
o
: 其他类型角色Other
a
: 所有角色All
,就是上面三种角色的集合+
: 添加权限-
: 去掉权限=
: 设置权限r
: 读取权限w
: 写入权限x
: 执行权限
例如命令:
chmod u+r 文件名称
复制代码
该命令是指给用户User
添加读取权限
我们经常碰到如下命令:
chmod +x 文件名称
复制代码
这里没有看到用户角色,如果不设置用户角色,那么默认是All
,所以这句话的意思是给所有角色添加执行权限。
文件的扩展属性权限
细心的话可以发现,我们前面展示权限的时候发现,有些文件的末尾有@
符号,这些都代表着有扩展属性,我们可以用如下命令看看有哪些额外信息:
ls -l@
复制代码
我们看到这些带有@
符号都有额外信息字段:
你可以把扩展属性看成一个[String: Data]
的字典,红框框起来的就是key
,后面的数字是Data
的长度,具体操作扩展属性的命令是xattr
,下面列举下该命令的用法:
# 显示一个文件的存在的扩展属性
xattr 文件名
# 显示一个文件存在的扩展属性及这个属性的值:
xattr -l 文件名
# 给一个文件添加 com.example.color 属性:
xattr -w com.example.color 文件名
# 清除一个文件的 com.example.color 属性:
xattr -d com.example.color 文件名
# 清除一个文件夹内所有文件的 com.example.color 属性:
xattr -d -r com.example.color 文件夹
# 清除一个文件的所有扩展属性:
xattr -c 文件名
复制代码
我们随便找一个文件试下:
我们看到com.apple.quarantine
这个属性直接能看到他的值,com.apple.macl
只能看到二进制数据,从边上的ASCII
码也看不出啥。所以com.apple.quarantine
的Data是ASCII
码编码的,而com.apple.macl
的数据我也不知道是啥。
我们也可以用我们熟悉的OC
或者Swift
代码获取扩展属性:
let manager = FileManager.default
let attr = try! manager.attributesOfItem(atPath: path)
let exten = attr[FileAttributeKey.init("NSFileExtendedAttributes")] as! [String: Data]
复制代码
有些数据是ASCII
码,例如刚才的com.apple.quarantine
属性,看下如何获取ASCII
码属性值:
let str = String(data: value, encoding: .ascii)
复制代码
有些数据是plist文件格式的,例如com.apple.metadata
起头的,看下如何获取plist的属性值:
var format = PropertyListSerialization.PropertyListFormat.binary
let custom = try? PropertyListSerialization.propertyList(from: value, options: PropertyListSerialization.ReadOptions(rawValue: 0), format: &format)
复制代码
当然肯定还有格式的数据,等待你自己慢慢尝试,这些格式都不是固定的。你也可以加入自定义的扩展属性,数据格式也可以自己规定,比如说utf8
,这些就不展开说了。
值得说的一点,现在好多网上下载的应用,不受信任打不开,还有些应用第一打开,就会提示从某某地方的来源,你是否确认打开,都是扩展属性的问题。如果真的碰上打不开的应用,删除com.apple.quarantine
属性,八成就能打开了。