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


13

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

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

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

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

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

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

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

답변:


21

조치를 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줄 번호를 얻는 옵션을 사용하고 있습니다.


따라서 내가 맞다면 {}는 find 명령의 출력에 저장되는 변수와 같으며 "+"기호 뒤에 cat 매개 변수를 작성해야합니까? 아니 ? 편집 : 좋아 당신은 당신의 게시물을 편집하고 지금 당신은 내 질문에 대답했습니다 : P Thanx man! 해결!
Eksapsy

@ general656 내 편집 내용 확인 ..
heemayl

1
cat-n옵션 에 대해 몰랐다는 사실이 놀랍습니다. 나는 무작위 질문을 읽는 것을 좋아합니다.
mazunki

1

명령 대체

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

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)양식을 사용할 때 괄호 안의 모든 문자가 명령을 구성합니다. 아무것도 특별하게 취급되지 않습니다.

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

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

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


경우 참고 것을 find발견 너무 많은 파일이,이 "너무 긴 인수 목록의"를 생성하는 것입니다 오류가 돗 구기 불러들이려고하는데 cat. 또한 공백 문자가 포함 된 파일 이름 및 파일 이름이 붙는 문자가 포함 된 파일 이름을 처리하는 데 문제가 있습니다.
Kusalananda

-1

그러면 텍스트 (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 {} \;

-2

파이프 및 크래그 사용

find /* -name pg_hba.conf | xargs cat

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

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

1
누군가 누군가라는 파일 /tmp/ /dev/urandom /pg_hba.conf을 만들면 루트가의 전체 내용을 덤프 할 수 /dev/urandom있습니다. 상황에 따라 더 나쁠 수도 있습니다. xargs거의 사용하지 -0않으면 거의 사용해서는 안됩니다 . 또한 sudo xargs보다 낫습니다 xargs sudo. 그리고 /*더 낫습니다 /.
Stéphane Chazelas

1
OP는 cat을 사용하여 파일 내용을 stdout에 인쇄하려고합니다. 따라서 목적은 고양이에 의해 제공됩니다. 문제는 찾기 명령에서 cat을 사용하여 sudo 또는 find를 사용하는 방법이 아닌 파일의 내용을 인쇄하는 방법입니다. 위의 명령은 질문을 해결합니다. 예 xargs -0은 당신이 지적한 유일한 건설적인 것입니다. 그러나 사용법을 보여주지 않았습니다. 무례하지 마십시오.
앱 작업

그게 무례한 것 같으면 미안 그것은 의도가 아니 었습니다. 나는 한계를 지적하고 싶었다. (답 쇼 나쁜 관행 find|xargs않고 -0따라서 아래로 투표 정말 금지되어야한다). findwithout 의 출력은 -print0후 처리가 가능하지 않습니다. -print0표준이 아닙니다. 표준 sudo find / -name pg_hba.conf -exec cat {} +은 또한 콘텐츠를 덤프하도록 만들 수 있습니다 /dev/urandom(예를 들어 누군가가 심볼릭 링크를 만들었고 /tmp/pg_hba.conf최소한 경쟁 조건이없는 이식 가능한 방법이없는 경우).
Stéphane Chazelas

1
sudo" 만약 "을 사용하지 않겠습니까?
lindhe

달리는 것보다 낫습니다sudo rm -rf /
devinbost
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.