我正在尝试获取给定目录树中所有文件类型的信息。file *
在当前目录中运行效果很好,但它不会遍历子目录,而且似乎没有选项可以让它这样做。
我究竟如何file
递归执行命令,以便列出给定目录及其子目录中所有文件的文件类型?
答案1
这其他答案提供的方法不是最好的:
find . -type f | file -f -
至少存在两个问题:
-f
选项不需要POSIX,的某些实现file
可能不支持它。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。