다른 하위 디렉터리의 파일을 연결하는 방법은 무엇입니까?

다른 하위 디렉터리의 파일을 연결하는 방법은 무엇입니까?

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

관련 정보