如何递归运行文件命令

如何递归运行文件命令

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

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

答案1

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

find . -type f | file -f -

至少存在两个问题:

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

一种强大且便携的方法:

find . -type f -exec file -- {} +

笔记:

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

答案2

“给定目录及其子目录中的所有文件”这句话应该会让你倾向于使用 find 命令:

find . -type f | file -f -

将递归读取当前目录和子目录中的所有文件,并让文件识别其类型。您可能需要为包含压缩的类型添加 -z。

相关内容