“find”명령 출력에서“cat”명령을 사용하는 방법은 무엇입니까? 예를 들어 find의 출력이

주어진 파일의 데이터를 인쇄 할 수 있도록 find명령 의 출력을 명령 으로 리디렉션하고 싶습니다 cat.

따라서 예를 들어 find의 출력이 /aFile/readme고양이라면 다음과 같이 해석되어야합니다 cat ./aFile/readme. 어떻게하면 즉시 할 수 있습니까?

파이프를 사용해야합니까?

나는 이것의 버전을 시도했다 :

cat | find ./inhere -size 1033c 2> /dev/null

그러나 이것이 완전히 잘못 된 것 같아요? 물론 출력은 하나의 파일이며 여러 파일이 아니라고 확신합니다.

어떻게하면 되나요? 나는 구글에서 검색했지만 해결책을 찾지 못했습니다. 아마도 올바르게 검색하지 않았기 때문입니다 : P



답변

조치를 find사용하여 혼자서 이를 수행 할 수 있습니다 -exec.

find /location -size 1033c -exec cat {} +

{}cat은 여러 개의 인수를 취할 수 +있으므로 찾은 파일로 확장되고 호출 당 가능한 많은 인수를 읽을 cat수 있습니다.

귀하의 경우 find이없는 +확장자를하거나 하나 하나 파일을 읽을 수 :

find /location -size 1033c -exec cat {} \;

의 옵션을 사용하려면 다음을 cat수행하십시오.

find /location -size 1033c -exec cat -n {} +
find /location -size 1033c -exec cat -n {} \;

여기서는 -n줄 번호를 얻는 옵션을 사용하고 있습니다.


답변

명령 대체

또 다른 옵션은 명령 대체 를 사용하는 것 입니다. 명령을 감싸면 명령 $()이 실행되고 명령이 출력으로 바뀝니다.

cat $(find ./inhere -size 1033c 2> /dev/null)

될 것입니다

cat ./inhere/file1 .inhere/file3

이것은 백틱과 함께 이전 스타일의 줄 바꿈 명령을 사용하는 것과 다소 비슷합니다.

cat `find ./inhere -size 1033c 2> /dev/null`

위에 링크 된 문서에서 더 자세한 내용

Bash는 서브 쉘 환경에서 명령을 실행하고 명령 대체를 명령의 표준 출력으로 바꾸고 후행 줄 바꿈을 삭제하여 확장을 수행합니다. 포함 된 줄 바꿈은 삭제되지 않지만 단어 분리 중에 제거 될 수 있습니다. 명령 대체 $(cat file)는 동일하지만 더 빠른 것으로 대체 될 수 있습니다 $(< file).

치환 구식 형태 역 인용 부호가 사용되는 경우, 백 슬래시 다음 경우를 제외하고 그 뜻을 그대로 갖고있는 $, `또는 \. 백 슬래시 앞에 있지 않은 첫 번째 인용 부호는 명령 대체를 종료합니다. $(command)양식을 사용할 때 괄호 안의 모든 문자가 명령을 구성합니다. 아무것도 특별하게 취급되지 않습니다.

대체 명령이 중첩 될 수 있습니다. 역 따옴표로 묶인 양식을 사용할 때 중첩하려면 내부 역 따옴표를 백 슬래시로 이스케이프 처리하십시오.

큰 따옴표 안에 대체가 나타나면 단어 분리 및 파일 이름 확장이 결과에서 수행되지 않습니다.

사용법에 대한 좋은 예는 이 다른 답변 을 참조하십시오 .


답변

그러면 텍스트 (ascii) 파일의 이름과 내용이 재귀 적으로 만 인쇄됩니다.

find . -type f -exec grep -Iq . {} \; -print | xargs awk 'FNR==1{print FILENAME ":" $0; }'

한 번 더 시도

find . -type f -exec grep -Iq . {} \; -printf "\n%p:" -exec cat {} \;

답변

파이프 및 크래그 사용

find /* -name pg_hba.conf | xargs cat

권한 부족으로 실패하면 sudo를 사용하여 검색중인 디렉토리에서 find 명령을 실행할 권한이 있는지 확인할 수 있습니다.

 sudo find /* -name pg_hba.conf | xargs sudo cat