我是一名开发人员。我编写.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 行。在示例中调用sed
via 的方式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
命令在能够输出之前失败。