如何读取找到的所有文件的前 10 行,并将它们附加到新文件中?

如何读取找到的所有文件的前 10 行,并将它们附加到新文件中?

我是一名开发人员。我编写.NET 代码。我有很多代码文件,以Controller.cs.

自从我迁移到 .NET 6 以来,我想使用它提供的功能。

我的所有代码文件都从using statements顶部开始。例如:

using Microsoft.AspNetCore.Mvc;
using System.Threading;
using System.Collections.Generic;

namespace Globalization.UserApi
{
    public class LocaleController : Controller
    {

基本上,我想找到所有Controller.cs文件,读取它们的前 X 行,最好只读取以 开头的行using,然后将它们全部附加到AllUsings.txt文件中。这样我就可以决定using statements我拥有什么。

我试过:

find / -name "*Controller.cs" 2>&- | xargs sed -n '1,10p' >> /temp/AllUsings.txt

但由于某种我无法理解的原因,它仅将一个文件的开头附加到输出中。

我应该如何更改这个脚本?

答案1

要从文件中获取前十行,请head不带任何选项使用:

find / -type f -name '*Controller.cs' -exec head {} \; >/temp/AllUsings.txt 2>/dev/null

使用 时sed,编辑脚本1,10p将在实用程序的命令行上打印第一个文件的前 10 行。在示例中调用sedvia 的方式xargs将确保调用sed尽可能少的次数(即一次使用尽可能多的文件名)。这就是为什么您只获得第一个文件的前 10 行。

为了缓解这个问题,GNUsed实用程序有一个非标准-s选项,可以为每个新输入文件重置行号计数器。这意味着您可以像这样使用它来sed尽可能少地调用批量找到的文件:

find / -type f -name '*Controller.cs' -exec sed -s -n '1,10p' {} + >/temp/AllUsings.txt 2>/dev/null

如果您使用的sed不带此选项,请sed每个文件调用一次:

find / -type f -name '*Controller.cs' -exec sed -n '1,10p' {} \; >/temp/AllUsings.txt 2>/dev/null

另请注意,您的sed -n '1,10p'命令(对于单个文件)编写得更有效sed 10q,即“在第 10 行后退出”。


/dev/null将标准错误流重定向到比使用 关闭它更安全2>&-。如果实用程序需要在该流上输出某些内容,则关闭该流可能会导致实用程序失败。

例如:

$ awk 'BEGIN { print "Hello" >"/dev/stderr"; print "Bye"}' 2>/dev/null || echo failed
Bye
$ awk 'BEGIN { print "Hello" >"/dev/stderr"; print "Bye"}' 2>&- || echo failed
failed

请注意,该字符串Bye在第二个示例中从未出现过。该awk命令在能够输出之前失败。

相关内容