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

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

나는 각각 많은 파일을 포함하는 많은 하위 디렉터리가 있는 큰 폴더를 가지고 있습니다 .txt. 이 모든 파일을 하나의 파일로 연결하고 싶습니다 .txt. 각 하위 디렉토리에 대해 이 작업을 수행할 수 있지만 cat *.txt>merged.txt큰 폴더의 모든 파일에 대해 수행하려고 합니다. 어떻게 해야 하나요?

답변1

시도해 보세요

find /path/to/source -type f -name '*.txt' -exec cat {} + >mergedfile

하위 디렉터리에서 모든 "*.txt" 파일을 반복적으로 찾아 f모든 파일을 하나로 연결합니다./path/to/sourcemergedfile

해당 디렉토리의 모든 하위 디렉토리 파일을 연결하려면 다음을 수행하십시오.

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다시 추가 사용).

관련 정보