![bash find xargs grep 仅出现一次](https://linux22.com/image/41/bash%20find%20xargs%20grep%20%E4%BB%85%E5%87%BA%E7%8E%B0%E4%B8%80%E6%AC%A1.png)
也许这有点奇怪 - 也许还有其他工具可以做到这一点,但是,嗯......
我使用以下经典的 bash 命令来查找包含某个字符串的所有文件:
find . -type f | xargs grep "something"
我有大量不同深度的文件。第一次出现“某事”对我来说已经足够了,但是 find 继续搜索,并且需要很长时间才能完成其余文件。我想做的是从 grep 返回 find 的“反馈”,以便 find 可以停止搜索更多文件。这样的事可能吗?
答案1
只需将其保留在 find 范围内即可:
find . -type f -exec grep "something" {} \; -quit
它是这样工作的:
-exec
当-type f
意志成真时,意志就会发挥作用。并且因为当匹配时grep
返回0
(success/true) ,因此将被触发。-exec grep "something"
-quit
答案2
find -type f | xargs grep e | head -1
正是这样做的:当head
终止时,管道的中间元素会收到“损坏的管道”信号通知,依次终止,并通知find
.您应该会看到一条通知,例如
xargs: grep: terminated by signal 13
这证实了这一点。
答案3
要在不更改工具的情况下执行此操作:(我喜欢 xargs)
#!/bin/bash
find . -type f |
# xargs -n20 -P20: use 10 parallel processes to grep files in batches of 20
# grep -m1: show just on match per file
# grep --line-buffered: multiple matches from independent grep processes
# will not be interleaved
xargs -P10 -n20 grep -m1 --line-buffered "$1" 2> >(
# Error output (stderr) is redirected to this command.
# We ignore this particular error, and send any others back to stderr.
grep -v '^xargs: .*: terminated by signal 13$' >&2
) |
# Little known fact: all `head` does is send signal 13 after n lines.
head -n 1