저는 개발자입니다. .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줄을 인쇄합니다. 예제에서 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
파일당 한 번씩 호출하세요.
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
출력이 가능해지기 전에 명령이 실패합니다 .