見つかったすべてのファイルの最初の10行を読み、新しいファイルに追加するにはどうすればよいですか?

見つかったすべてのファイルの最初の10行を読み、新しいファイルに追加するにはどうすればよいですか?

私は開発者です。 .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行を印刷します。例では、sedvia が呼び出される方法は、できるだけ少ない回数で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

この文字列は、Bye2番目の例では表示されません。awk出力が可能になる前にコマンドが失敗します。

関連情報