【问题标题】:Unix search command in entire folder整个文件夹中的 Unix 搜索命令
【发布时间】:2021-09-03 07:54:13
【问题描述】:

我需要用两个关键字搜索整个文件夹,比如说 ballbat。 unix 文件夹中有 10k 个文件。所以我需要使用命令来搜索该文件夹中具有这两个关键字的整个文件。搜索必须是文件明智的。以下命令用于搜索单个文件,但我需要使用文件方式搜索整个文件夹。

grep [args] -e ball -e bat file1.xml

上面的命令告诉我这两个关键字是否存在于该文件中。但我需要的是文件夹中包含这两个关键字的文件。

【问题讨论】:

  • 您是否正在寻找 grep 选项 "-l, --files-with-matches -- 禁止正常输出;而不是打印通常会从中打印输出的每个输入文件的名称。" ? (结合* 作为文件名或-r . 用于递归搜索目录及以下)
  • @dratenik - 是的,我需要该文件夹中的文件名。考虑如果假设该文件夹有 1000 个文件,而上述两个关键字仅存在于 45 个文件中,那么我需要输出 45 个文件名,这有意义吗?
  • find . -type f -exec grep -e ball -e bat {} \;
  • @WilliamPursell - 第二个命令打印输出中的所有文件,不管它有没有。但是考虑下面的命令它给了我球的输出,在这个相同的命令中我可以添加 /,|,& 或任何其他方式来添加 bat 吗??
  • 找到 ./ -type f -print0 | xargs -0 grep -i "球" -ls

标签: shell unix scripting


【解决方案1】:

如果您在该文件夹中执行grep -e ball -e bat * 应该可以工作。

【讨论】:

  • 它正在接收或运行,但我需要输出和运行。 IE。它必须显示具有这两个关键字的文件与其中一个关键字不同
【解决方案2】:

如果文件包含ballbatgrep [args] -e ball -e bat file1.xml 将匹配,这似乎不是您想要的。如果这是你想要的,你可以这样做:

find "$dir" -type f -exec grep -l -e ball -e bat {} \;

其中$dir 是您要搜索的根目录。但是如果你想找到包含这两个词的所有文件,你需要做一些不同的事情。也许:

find "$dir" -type f -exec sh -c 'grep -q ball $1 && grep -q bat $1' _ {} \; -print

find "$dir" -type f -exec sh -c 'grep -q ball $1 && grep -l bat $1' _ {} \;

【讨论】:

  • @willliam - 第二个命令打印输出中的所有文件,不管它有没有。但是考虑下面的命令它给了我球的输出,在这个相同的命令中我可以添加 /,|,& 或任何其他方式来添加 bat 吗??
  • 找到 ./ -type f -print0 | xargs -0 grep -i "球" -ls
【解决方案3】:

您可以使用两个-exec 步骤:

find . -type f \
    -exec grep -q 'ball' {} \; \
    -exec grep -l 'bat' {} +

第一个-exec 步骤保留所有包含ball 的文件——使用print 而不是第二个-exec 步骤来查看是什么文件。

第二个-exec 步骤列出了包含bat 的文件的名称,因为它们已经被过滤为包含ball,所以结果是包含两者的文件列表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-24
    • 1970-01-01
    • 2014-10-15
    • 2021-08-15
    • 1970-01-01
    • 1970-01-01
    • 2019-07-19
    相关资源
    最近更新 更多