如何打印出符合某些“查找”条件的所有文件的第一行?

如何打印出符合某些“查找”条件的所有文件的第一行?

我想打印出每个.txt超过 100 字节的文件的第一行。到目前为止,我已经设法收集符合条件的文件,但我不知道如何打印文件的第一行文本。

find -size +100c -name "*.txt"

或者我完全走错了路?

答案1

您需要head -n 1在每个文件上运行:

find . -size +100c -name '*.txt' -execdir head -n 1 {} \;

或者,如果您find不支持-execdir

find . -size +100c -name '*.txt' -exec head -n 1 {} \;

如果您的head版本支持-q,或者您不关心在一次调用中处理多个文件时为每个文件显示的标头,则可以使用以下命令使这两种变体稍微更有效

… -exec head -q -n 1 {} +

(看竞争条件与-exec了解的好处-execdir。)

答案2

您经常会看到xargs建议处理以下输出find

find -size +100c -name "*.txt" | xargs head -n 1

xargs 获取列表文件名由 find 生成,并将文件名作为给定命令的参数提供。它智能地这样做以避免“参数太多”或“命令太长”错误。

head -q -n1如果您不希望在给定多个文件名时提供额外的信息头,您可能需要使用。


由于文件名几乎可以包含任何字符(包括换行符),因此这是对 find|xargs 的更安全的调用:

find -size +100c -name "*.txt" -print0 | xargs -0 head -n 1
  • -print0指令输出由空字节分隔的文件名,而不是默认的换行符
  • xargs-0选项使用空字节作为参数分隔符而不是默认的换行符。

相关内容