我想查找所有以空白行作为文件第一行的 Java 文件。我有以下内容,它只是将每个文件的第一行(和文件名)输出到输出文件“fileList.txt”中:
find . -name *java | xargs head -n1 > fileList.txt
然而我需要对“fileList.txt”进行后期处理来找到空文件名。
我如何向 xargs 添加“if”条件,以便仅当第一行为空白时才输出文件名?
答案1
无需使用| xargs
,find 有一个-exec
标志,用于对匹配的文件执行命令。另外,您需要转义,*java
否则 bash 将扩展参数并find
发出警告。
这条awk
命令应该可以满足你的需要:
find . -name '*java' -exec awk 'NR==1&&/^$/{print FILENAME}' {} \;
NR==1
仅选择第一行。/^$/
匹配空行。print FILENAME
打印匹配的文件。
如果第一行不是真的很空但仅包含空格,您可以修改正则表达式
/^\s*$/
其中\s*
匹配 0 个或更多空格字符。
答案2
以下是另一种使用方法sed
:
find . -name '*.java' -exec sed -n '/^$/F;q' {} \;
请注意,对于大量小文件来说,它的效率会有些低,因为它对sed
每个文件调用一次 - 但是它只读取每个文件的一行。
要处理除空格之外的空行,请更改/^$/
为/^[[:blank:]]*$/
或/^[ \t]*$/
(空格制表符)。