bash shell脚本编程经典实例(第2版)
上QQ阅读APP看书,第一时间看更新

1.6 获取文件的相关信息

1.6.1 问题

你需要文件的更多相关信息,例如类型、属主、是否可执行、有多少硬链接,以及最后一次访问或更改的时间。

1.6.2 解决方案

使用 lsstatfilefind 命令:

$ 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

  使用短格式,每行只显示一个文件。

statfilefind 命令都拥有众多控制输出格式的选项,你可以查询手册页了解它们所支持的选项。例如,下列这些选项可以生成类似于 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 章