
각각 많은 파일을 보유하는 많은 하위 디렉터리가 포함된 큰 폴더가 있습니다 .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
다시 추가하는 데 사용).