발견된 모든 파일의 처음 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

파일에서 처음 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파일당 한 번씩 호출하세요.

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출력이 가능해지기 전에 명령이 실패합니다 .

관련 정보