【发布时间】:2016-12-13 21:17:16
【问题描述】:
我的文件系统看起来像这样,但文件类型未知。
└── 63206
└── 4443606
├── 6433
├── 712861
├── 726355
└── 723714
对于每个文件,我可以通过file <filename> 获取有关其尺寸的规范。
6433: PNG image data, 138 x 209, 8-bit/color RGBA, non-interlaced
有人能告诉我如何递归地管道,以便我可以为 bash 中的每个文件路径获得这样的输出吗?
我尝试了类似find | file 的方法。我对管道 bash 不太熟悉。
【问题讨论】:
-
找到 . | xargs 文件,这将打印当前目录中的所有文件(和文件夹中的项目)并将其传递给文件
-
仅供参考,
gm identify(来自 GraphicsMagic——另见来自 ImageMagick 的identify命令)可能是比file更好的工具;它实际上允许您指定格式字符串,以便您可以以更容易解析的任何格式获取所需的确切元数据。 -
Re:“管道”,顺便说一句——管道将一个程序的标准输出连接到另一个程序的标准输入。如果您不能告诉
file从其标准输入读取要运行的文件的名称,那么您不能将此类文件的列表通过管道传输到file(没有诸如xargs之类的中间工具--这实际上调用了它自己的错误/复杂性)。因此,管道并非无条件地适用于进程之间各种连接的正确工具。 -
即使一个进程可以从标准输入(
file可以)读取它的输入,也只有一个标准输入流——如果你想针对多个输入运行它,这可能意味着需要为每个输入运行一个实例。也就是说:find . -type f -exec file -- {} +比find . -type f -exec sh -c 'for arg; do cat -- "$arg" | file -; done'效率更高,find . -type f -exec sh -c 'for arg; do cat -- "$arg" | file -; done'是一种替代方案,可以设置适当的管道,从而以完全字面的方式完成您的要求。