上QQ阅读APP看书,第一时间看更新
1.6 获取文件的相关信息
1.6.1 问题
你需要文件的更多相关信息,例如类型、属主、是否可执行、有多少硬链接,以及最后一次访问或更改的时间。
1.6.2 解决方案
使用 ls
、stat
、file
或 find
命令:
$ touch /tmp/sample_file
$ ls /tmp/sample_file
/tmp/sample_file
$ ls -l /tmp/sample_file
-rw-r--r-- 1 jp jp 0 Dec 18 15:03 /tmp/sample_file
$ stat /tmp/sample_file
File: "/tmp/sample_file"
Size: 0 Blocks: 0 IO Block: 4096 Regular File
Device: 303h/771d Inode: 2310201 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 501/ jp) Gid: ( 501/ jp)
Access: Sun Dec 18 15:03:35 2005
Modify: Sun Dec 18 15:03:35 2005
Change: Sun Dec 18 15:03:42 2005
$ file /tmp/sample_file
/tmp/sample_file: empty
$ file -b /tmp/sample_file
empty
$ echo '#!/bin/bash -' > /tmp/sample_file
$ file /tmp/sample_file
/tmp/sample_file: Bourne-Again shell script text executable
$ file -b /tmp/sample_file
Bourne-Again shell script text executable
有关 find
命令的更多细节,参见第 9 章。
1.6.3 讨论
ls
命令只显示文件名,-l
选项可以提供每个文件更详细的信息。ls
的选项很多,可以查询手册页了解其所支持的选项,其中有用的选项包括以下几个。
-a
不隐藏以 .
(点号)开头的文件。
-A
和 -a
相似,但不显示两个常见的目录 .
和 ..
,因为每个目录中都有这两项。
-F
文件名结尾以下列类型标识符之一显示文件类型。
斜线(/
)表示该文件是目录,星号(*
)表示该文件是可执行文件,@
表示符号链接,等号(=
)表示套接字,竖线(|
)表示 FIFO(first in, first out)缓冲。
-l
使用长列表格式。
-L
显示链接目标文件的信息,而非符号链接本身。
-Q
引用名(quote name)(GNU 扩展,仅部分系统支持)。
-r
逆序排列。
-R
递归显示子目录。
-S
按照文件大小排序。
-1
使用短格式,每行只显示一个文件。
stat
、file
和 find
命令都拥有众多控制输出格式的选项,你可以查询手册页了解它们所支持的选项。例如,下列这些选项可以生成类似于 ls -l
的输出:
$ ls -l /tmp/sample_file
-rw-r--r-- 1 jp jp 14 Dec 18 15:04 /tmp/sample_file
$ stat -c'%A %h %U %G %s %y %n' /tmp/sample_file
-rw-r--r-- 1 jp jp 14 Sun Dec 18 15:04:12 2005 /tmp/sample_file
$ find /tmp/ -name sample_file -printf '%m %n %u %g %t %p'
644 1 jp jp Sun Dec 18 15:04:12 2005 /tmp/sample_file
注意,并非所有操作系统及其各版本都有这些工具。例如,Solaris 就默认不包含 stat
。
另外值得指出的是,目录其实就是一种操作系统会特别处理的文件,因此本节展示的这些命令也完全能够应用于目录,只不过有时可能需要修改命令才能得到想要的结果。例如,可以用 ls -d
列出目录本身的信息(不加该选项的 ls
列出的是目录的内容)。
1.6.4 参考
man ls
man stat
man file
man find
- 第 9 章