我正尝试在网站的所有文件中搜索每个文件最后5行中的空格,并希望终端返回符合该条件的所有文件的列表。
之所以这样,是因为我们在Drupal网站上遇到了问题,在该网站上将空白注入图像中,导致它们损坏并且无法显示。
我在下面尝试了一些方法,尽管我相信我已经很接近获得正确的命令了,但是这些都没有给我想要的结果。
我已经搜索了互联网和stackexchange,找到了一些我认为可以解决的答案,但不幸的是,这对我来说不是。
尝试#1
find . -name "*.php" | xargs grep -c -P '\s+$' | grep -v ':0$'
起初,这似乎可以列出所有带空格的文件,但我发现它不够具体,并给出了约500个文件的列表,但并非所有文件都以空格结尾。我开始仔细研究它们,但后来意识到它没有给我所有包含空格的文件的列表,因此找到了另一种方法。
尝试#2
find . -type f -exec bash -c 'grep -q " +$" < <(tail -n 5 "$1")' _ {} \; -printf '%p\n'
列出的所有内容都是两个JS文件,效果不是很好。
尝试#3
find . -type f -exec bash -c 'grep -q " +$" < <(tail -n 5 "$1") && printf '%\n' "$1"' _ {} \;
同样,它返回了相同的两个JS文件。
答案 0 :(得分:2)
你几乎在那里
font-family:quentinregular;
无效,因为修饰符grep -q " +$"
是扩展正则表达式的一部分,并且grep默认情况下与基本/ POSIX正则表达式一起工作(其中+
符号被解释为文字字符)。
有两种解决方案:
+
切换到扩展的正则表达式:-E
或通过在grep -qE " +$"
符号前加上反斜杠:+
grep -q " \+$"
答案 1 :(得分:2)
您必须转义grep表达式中的+
,例如。参见gnu grpe manual。
这里不需要使用< <(...)
外壳重定向和进程替换,只需将其|
用管道传输即可。
以下作品。请注意,我需要两次转义\\+
,因为\\
在括号\
中扩展为"
。:
find . -type f -exec sh -c 'tail -n 5 "$1" | grep -q " \\+$" && printf "%s\n" "$1"' -- {} \;
但是,在使用xargs
时,您可以并行进行-P0
,我也更喜欢使用-t
进行调试。对于奇怪的文件名,请在-print0
和-0
中添加find
和xargs
选项。
find . -type f | xargs -n1 sh -c 'tail -n 5 "$1" | grep -q " \\+$" && printf "%s\n" "$1"' --