find 명령의 파일을 각 파일이 큰따옴표 안에 있는 한 줄로 그룹화하는 방법은 무엇입니까? [복사]

find 명령의 파일을 각 파일이 큰따옴표 안에 있는 한 줄로 그룹화하는 방법은 무엇입니까? [복사]

이는 find를 사용하여 찾은 파일을 반복하거나 조작할 때 자주 직면하는 문제입니다.

다음 파일이 있습니다.

 $ find . -name "*ES 03-11*" 
./01jan/ES 03-11.txt
./02feb/ES 03-11.txt
./03mar/ES 03-11.txt
./04apr/ES 03-11.txt
./05may/ES 03-11.txt

다음 명령을 실행하고 싶습니다.

$ cat "./01jan/ES 03-11.txt" "./02feb/ES 03-11.txt" "./03mar/ES 03-11.txt" "./04apr/ES 03-11.txt" "./05may/ES 03-11.txt" | process

이는 find에서 제공한 각 줄을 연결하는 것을 의미하지만 큰 따옴표나 간단한 따옴표로 묶여 있습니다.

나는 이것을 시도했습니다 :

find . -name "*ES 03-11*" | awk '{printf "\"%s\" ", $0}' | xargs cat | process

이것은 작동하는 것 같지만 awk를 사용하지 않거나 기억하기 쉬운 작업이나 입력을 하지 않고 수행할 수 있는 다른 방법이 있는지 궁금합니다.

저는 FreeBSD와 Bourne Shell을 사용하고 있습니다.

답변1

요약하면 다음 -exec방법을 사용할 수 있습니다.

find . -name "*ES 03-11*" -exec cat {} +

또는 xargs방법:

find . -name "*ES 03-11*" | xargs -I xx cat xx

답변2

이것이 바로 NULL 종료의 목적입니다. find -print0불행 하게도 xargsFreeBSD에는 일치하는 명령이 없는 것 같습니다 . 이는 어떤 솔루션에도 포함되지 -0않습니다 .xargs

또 다른 해결책은 패턴을 반복하는 것입니다.

for file in */*'ES 03-11'*; do cat "$file"; done | process

또는 많은 파일의 경우

for dir in *
do
    [ -d "$dir" ] || continue
    for file in "$dir"/*'ES 03-11'*
    do
        [ -f "$file" ] && cat "$file"
    done
done | process

아니면 직접이라도

cat */*'ES 03-11'* | process

관련 정보