주어진 파일의 데이터를 인쇄 할 수 있도록 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