주어진 파일의 데이터를 인쇄할 수 있도록 명령의 출력을 명령 find
으로 리디렉션하고 싶습니다.cat
예를 들어, find의 출력이 이면 /aFile/readme
cat은 로 해석되어야 합니다 cat ./aFile/readme
. 이 작업을 즉시 수행하려면 어떻게 해야 합니까?
파이프를 사용해야 하나요?
나는 이 버전을 사용해 보았습니다:
cat | find ./inhere -size 1033c 2> /dev/null
그런데 그게 완전히 잘못된 것 같은데요? 물론 출력은 여러 파일이 아닌 하나의 파일일 뿐이라고 확신합니다.
그럼 어떻게 해야 하나요? 구글에서 검색했는데 해결방법을 못찾았네요. 검색을 제대로 못해서 그런거 같습니다 :P
답변1
find
다음 작업만 사용하여 -exec
이 작업을 수행 할 수 있습니다 .
find /location -size 1033c -exec cat {} +
{}
찾은 파일로 대체되며 여러 인수를 사용할 수 있으므로 find
각 +
호출에서 가능한 한 많은 인수를 읽을 수 있습니다 .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
옵션을 사용하여 줄 번호를 가져옵니다.
답변2
명령 대체
또 다른 옵션은 다음을 사용하는 것입니다.명령 대체. 래퍼 명령은 $()
명령을 실행하고 이를 출력으로 바꿉니다.
cat $(find ./inhere -size 1033c 2> /dev/null)
될 것입니다
cat ./inhere/file1 ./inhere/file2 ./inhere/file3
이는 백틱과 함께 이전 스타일 래퍼 명령을 사용하는 것과 거의 동일합니다.
cat `find ./inhere -size 1033c 2> /dev/null`
위에 링크된 문서의 자세한 내용
Bash는 하위 쉘 환경에서 명령을 실행하고 명령 대체를 명령의 표준 출력으로 바꾸고 후행 줄 바꿈을 제거하여 확장을 수행합니다. 포함된 개행 문자는 제거되지 않지만 단어 분리 중에 제거될 수 있습니다. 명령 대체를 사용하면 $(cat file)
명령을 동일하지만 더 빠른 명령으로 바꿀 수 있습니다 $(< file)
.
이전 스타일의 백틱 대체 형식을 사용하는 경우 백슬래시는 뒤에 $
, `
또는 가 오지 않는 한 문자 그대로의 의미를 유지합니다 \
. 선행 백슬래시가 없는 첫 번째 백틱은 명령 대체를 종료합니다. 이 $(command)
형식을 사용할 때 대괄호 안의 모든 문자는 명령을 구성합니다.
명령 대체는 중첩될 수 있습니다. 백틱 형식을 사용할 때 중첩하려면 백슬래시를 사용하여 내부 백틱을 이스케이프하세요.
큰따옴표 내에서 대체가 발생하면 결과에 대해 단어 분리 및 파일 이름 확장이 수행되지 않습니다.
바라보다이 다른 답변몇 가지 좋은 사용 예입니다.
답변3
그러면 텍스트(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 {} \;
답변4
파이프 및 xargs 사용
find /* -name pg_hba.conf | xargs cat
권한 부족으로 인해 실패하는 경우 sudo를 사용하여 검색하려는 디렉터리에서 find 명령을 실행할 수 있는 권한이 있는지 확인할 수 있습니다.
sudo find /* -name pg_hba.conf | xargs sudo cat