이는 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
불행 하게도 xargs
FreeBSD에는 일치하는 명령이 없는 것 같습니다 . 이는 어떤 솔루션에도 포함되지 -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