查找最后几行中包含空格的所有文件

时间:2019-06-04 16:42:22

标签: linux whitespace

我正尝试在网站的所有文件中搜索每个文件最后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文件。

2 个答案:

答案 0 :(得分:2)

你几乎在那里

font-family:quentinregular;

无效,因为修饰符grep -q " +$" 是扩展正则表达式的一部分,并且grep默认情况下与基本/ POSIX正则表达式一起工作(其中+符号被解释为文字字符)。

有两种解决方案:

  1. 使用标志+切换到扩展的正则表达式:-E 或通过在grep -qE " +$"符号前加上反斜杠:+
  2. 但是,因为(以我的经验),扩展的正则表达式在Unix中比基本的正则表达式慢,并且您想查找“末尾有一个或多个空格”的文件:grepping“末尾一个空格”也会列出适当的文件: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中添加findxargs选项。

find . -type f | xargs -n1 sh -c 'tail -n 5 "$1" | grep -q " \\+$" && printf "%s\n" "$1"' --