私は開発者です。 .NET コードを記述します。にコードファイルがたくさんありますController.cs
。
.NET 6に移行して以来、.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つのファイルの先頭のみが出力に追加されます。
このスクリプトをどのように変更する必要がありますか?
答え1
ファイルから最初の10行をインポートするには、head
オプションなしで使用してください。
find / -type f -name '*Controller.cs' -exec head {} \; >/temp/AllUsings.txt 2>/dev/null
を使用すると、sed
編集スクリプトは1,10p
ユーティリティコマンドラインの最初のファイルの最初の10行を印刷します。例では、sed
via が呼び出される方法は、できるだけ少ない回数でxargs
呼び出されることを保証しますsed
(つまり、一度にできるだけ多くのファイル名を使用して)。これが最初のファイルの最初の10行だけを取得する理由です。
この問題を軽減するために、GNUユーティリティには、新しい入力ファイルごとに行番号カウンタをリセットする非sed
標準オプションがあります。これは、できるだけ少ない呼び出しで見つかったファイルをバッチ処理する-s
ために次のように使用できることを意味します。sed
find / -type f -name '*Controller.cs' -exec sed -s -n '1,10p' {} + >/temp/AllUsings.txt 2>/dev/null
sed
このオプションなしで使用する場合は、sed
ファイルごとに1回呼び出します。
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
2番目の例では表示されません。awk
出力が可能になる前にコマンドが失敗します。