如何在我的回购协议中找到最后一行有特定单词的每个文件?
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
也就是说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