나는 각각 많은 파일을 포함하는 많은 하위 디렉터리가 있는 큰 폴더를 가지고 있습니다 .txt
. 이 모든 파일을 하나의 파일로 연결하고 싶습니다 .txt
. 각 하위 디렉토리에 대해 이 작업을 수행할 수 있지만 cat *.txt>merged.txt
큰 폴더의 모든 파일에 대해 수행하려고 합니다. 어떻게 해야 하나요?
답변1
시도해 보세요
find /path/to/source -type f -name '*.txt' -exec cat {} + >mergedfile
하위 디렉터리에서 모든 "*.txt" 파일을 반복적으로 찾아 f
모든 파일을 하나로 연결합니다./path/to/source
mergedfile
해당 디렉토리의 모든 하위 디렉토리 파일을 연결하려면 다음을 수행하십시오.
find . -mindepth 1 -type d -execdir sh -c 'cat $1/*.txt >> $1/mergedfile' _ {} \;
답변2
Bash를 사용하고 다수의 텍스트 파일이 포함된 경우(즉, 매우 크지만 무한하지는 않은 최대 매개변수 수 제한을 초과하지 않는 경우) 다음 함수를 사용하여 쉽게 이를 달성할 수 있습니다 globstar
.
$ shopt -s globstar
$ cat **/*.txt > merged.txt
find
보다 일반적이지만 덜 우아한 접근 방식은 이를 드라이버 로 사용 하고 cat
각 파일에서 호출하여 출력을 추가하는 것입니다.
$ find -name \*.txt -exec sh -c 'cat {} >> merged.out' \;
sh
각 의 결과를 추가하려고 하므로 여기서 호출이 필요합니다 cat
. 출력 파일의 확장자가 다른지, 병합하려는 트리 외부에 있는지 확인하거나 find
출력 파일 자체를 연결해 볼 수 있습니다.
답변3
특정 순서로 연결해야 하는 경우 다음 코드는 사전순으로(경로 이름별로 정렬) 파일을 연결합니다 bash
.
shopt -s globstar
for name in **/*.txt; do
[ -f "$name" ] && cat <"$name"
done >merged.out
이는 find
명령 과 유사합니다.
find . -type f -name '*.txt' -exec cat {} ';' >merged.out
순서가 다를 수 있다는 점을 제외하면 일반 파일에 대한 심볼릭 링크가 포함되고( && [ ! -L "$name" ]
필요하지 않은 경우 추가) 숨겨진 파일(및 숨겨진 디렉터리의 파일)은 제외됩니다( shopt -s dotglob
다시 추가 사용).