【问题标题】:Find through grep to file通过grep查找文件
【发布时间】:2017-09-09 19:10:42
【问题描述】:

我正在尝试通过grep 将输出从find 发送到file -b 命令,而忽略我在正则表达式中定义的特定文件。据我所知,我认为您不能将输出通过管道传输到file。 您知道如何在不使用任何外部文件的情况下做到这一点吗? 我不需要使用 grep 来忽略文件,但我需要使用指定的正则表达式来忽略来自实用程序 file 的文件和输出,所以如果有其他选项我愿意接受。

提前致谢:)

我尝试了什么:

find dir -type f -exec file -b {} \;

这对我有用,但不会忽略任何文件

find dir -type f -exec grep -v 'file.' {} \; -exec file -b {} \;

作为第一个示例工作,但打印出我不需要的文件内容

编辑:我需要忽略文件名和路径,而不是 file 的输出

EDIT2:这是我的文件夹

dir
dir/a
dir/a/b
dir/a/b/c
dir/a/b/c/file
dir/a/b/filec
dir/a/fileb
dir/filea

每个文件都是 ASCII 文本类型,我想要的输出是使用这个正则表达式 'file(a|b)' 来忽略名为 fileafileb 的文件,但不是名为 filefilec 的文件,它们不适合在正则表达式中,所以我的命令所需的输出将是

ASCII text
ASCII text

【问题讨论】:

    标签: bash shell grep ksh


    【解决方案1】:

    如果我理解正确,类似:

    find dir -type f -exec file {} + | grep -Ev ':\s*ASCII text|empty'
    

    将列出不是ASCII textempty 的文件。

    如果您需要提前 grep 文件名:

    find dir -type f -print | grep -v 'pattern' | file -b -f - 
    

    【讨论】:

    • 对不起,这不是我的意思,我需要忽略文件/路径的名称,而不是特定类型的文件@jm666
    • @HynekBernard 刚刚添加了解决方案。
    • 编辑了问题,我不知道如何在命令的“中间”使用 grep 将其通过管道传输到文件中
    • 当我写完我的评论时,你的答案重新加载,现在可以了 :) 谢谢
    • 享受吧,请注意 - 如果文件名包含 \n(换行符),上述方法将不起作用。
    【解决方案2】:

    如果您想忽略一个模式,您可以使用! 运算符,它的工作原理如下:

    find -type f ! -name "file[ab]"
    

    【讨论】:

      【解决方案3】:

      带查找

      find dir -type f ! -name 'file[ab]' -exec file -b {} \;
      

      或者也许只是 bash:

      shopt -s globstar
      for f in dir/**/file[^ab]; do
          file -b "$f"
      done
      

      【讨论】:

      • 很好,虽然我建议在find 命令中使用+ 而不是\;,以便(通常)使用 single file 调用.或许还值得一提的是,GNU 和 BSD find 具有非标准的 -regex / -iregex 测试,以实现真正的基于正则表达式的匹配。
      猜你喜欢
      • 2014-08-23
      • 1970-01-01
      • 2011-08-07
      • 2015-05-04
      • 2014-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多