【问题标题】:pipe find to `file` (command) linux command recursive管道查找到`file`(命令)linux命令递归
【发布时间】: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' 是一种替代方案,可以设置适当的管道,从而以完全字面的方式完成您的要求。

标签: linux bash file recursion


【解决方案1】:

您可能想添加其他条件,但基本上来自顶级目录

find -type f -exec file {} \;

find path_to_dir -type f -exec file {} \;

【讨论】:

  • 我会考虑-exec file -- {} +;这样我们就不会多次调用file,并且可以处理文件名(带路径)以破折号开头的情况。
猜你喜欢
  • 2012-03-19
  • 2012-06-18
  • 2012-09-13
  • 1970-01-01
  • 2019-10-12
  • 2016-04-17
  • 2012-06-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多