如何递归运行文件命令

Has*_*ziz 2 linux unix bash command-line file-types

我正在尝试获取有关给定目录树中所有文件类型的信息。file在当前目录中运行效果很好,但它不会遍历子目录,而且似乎没有选项可以让它这样做,这对于 UNIX 工具来说似乎很奇怪。

我究竟如何file递归地执行命令,以便它列出给定目录及其子目录中所有文件的文件类型?

Kam*_*ski 8

其他的答案提供了不是最好的方法:

find . -type f | file -f -
Run Code Online (Sandbox Code Playgroud)

至少有两个问题:

  1. -fPOSIX不需要选项,某些实现file可能不支持它。
  2. find使用尾随换行符打印每个路径,因此通常每行一个路径(文件)。然后file -f -期望每行一条路径。问题在于包含换行符的路径;它们在 Unix 中仍然有效(但不常见)。在上述方法中,此类路径将file分为两行或更多行,并且该工具会将每行视为要检查的单独路径。

一种健壮且便携的方式:

find . -type f -exec file -- {} +
Run Code Online (Sandbox Code Playgroud)

笔记:

  • -exec file {} \;也可以工作,但是file会为找到的每个文件调用一个单独的文件。With+ file可以获得多个操作数(如果文件太多而无法构建单个命令,find仍然可以file多次调用)。期待+表现更好。另一方面file,处理多个参数可能会将其输出列化,因此它看起来“更好”。因此,这两个版本(with+和 with ;)在格式化输出方面可能有所不同。
  • 我使用了双破折号,以防有一个名称以-它开头的文件可以解释为一个选项。如果起始路径是.(在这种情况下)许多实现find将打印以 开头的路径.,所以--没有必要;但显然并非所有实现都这样做