如何在我的回购协议中找到最后一行有特定单词的每个文件?

how to find every file in my repo that has a specific word in the last line?

也就是说bash中如何结合tail和find/grep命令。 我想找到我的回购协议中的所有文件(包括子目录中的文件)在最后一行有一个特定的单词,在最后一行说 FIX。我试过 grep -Rl "FIX" 显示所有包含 "FIX" 的文件,但我不知道如何在其中组合 tail 命令。谁能帮忙??

运行 tail 一次处理所有文件,然后 grep FIX 的输出。由于 tail 在给定多个文件名时会在每一行前面加上相应的文件名,因此您只需要做这些。

find -type f -exec tail -n1 {} + | grep FIX

或使用 ** 查找所有文件和子目录,然后 运行 tail 一次一个地查找:

shopt -s globstar
for file in **; do
    [[ -f $file ]] && tail -n1 "$file" | grep -q FIX && echo "$file"
done

或使用 find 查找所有匹配项并将其通过管道传输到 while read 循环:

find -type f -print0 | while IFS= read -rd '' file; do
    tail -n1 "$file" | grep -q FIX && echo "$file"
done

或者做同样的事情,但使用 -exec + 和一个明确的子 shell:

find -type f -exec sh -c 'for file; do tail -n1 "$file" | grep -q FIX && echo "$file"; done' sh {} +

如果您想知道最后一行是否匹配某个模式,请使用 sed 并使用 $ 将匹配限制在最后一行。 sed 不会轻易给出 return 值或像 grep 那样漂亮地打印文件名,但它完成了工作。

find . -exec sh -c "sed -n '$ { /FIX/p; }' {} | grep -q . " \; -print

这里,我们使用-n来抑制打印,然后仅当最后一行匹配模式/FIX/时才打印(使用/p)。输出通过管道传输到 grep 以获得 return 值,find 使用该值来决定是否 -print 名称。

或者,您可以通过执行以下操作来避免对 return 使用 grep:

find . -exec awk 'END{ exit ! match([=11=], "FIX")}' {} \; -print