
주어진 파일의 데이터를 인쇄할 수 있도록 find
명령의 출력을 command로 리디렉션하고 싶습니다 .cat
예를 들어 find의 출력이 이면 /aFile/readme
cat은 로 해석되어야 합니다 cat ./aFile/readme
. 어떻게 즉시 할 수 있나요?
파이프를 사용해야 합니까?
나는 이것의 버전을 시도했습니다 :
cat | find ./inhere -size 1033c 2> /dev/null
그런데 이게 완전히 잘못된 것 같은데요? 물론 출력은 여러 파일이 아닌 하나의 파일일 뿐이라고 확신합니다.
그러면 어떻게 해야 합니까? Google에서 검색했는데 해결 방법을 찾지 못했습니다. 아마도 검색을 제대로 하지 않았기 때문일 것입니다. :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