디렉토리의 모든 (텍스트) 파일을 하나로 병합하는 방법은 무엇입니까?

디렉토리의 모든 (텍스트) 파일을 하나로 병합하는 방법은 무엇입니까?

14개의 파일이 있는데 모두 하나의 텍스트로 구성되어 있습니다. 나는 그것들을 하나로 결합하고 싶습니다. 어떻게 하나요?

답변1

기술적으로 cat("connect")가 수행해야 하는 작업이지만 대부분의 사람들은 파일을 표준 출력으로 출력하는 데만 사용합니다. 여러 파일 이름을 지정하면 순서대로 출력되며 새 파일로 리디렉션할 수 있습니다. 모든 파일인 경우 사용하면 됩니다 ./*(또는 /path/to/directory/*해당 디렉토리에 없는 경우). 쉘은 이를 모든 파일로 확장합니다. 파일 이름(기본적으로 숨겨진 파일 제외).

$ cat ./* > merged-file

glob을 확장하기 위해 csh또는 쉘을 사용하지 않는지 확인하십시오.tcsh뒤쪽에merged-file이전에 존재하지 않았던 출력에 대한 기능을 켜십시오 merged-file. 그렇지 않으면 파일 시스템을 가득 채우는 무한 루프가 발생할 수 있습니다.

파일 목록은 어휘순으로 정렬됩니다. 를 사용하는 경우 zshglob 한정자를 사용하여 순서를 변경할 수 있습니다(번호, 연령, 크기 등).

하위 디렉터리에 파일을 포함하려면 다음을 사용하세요.

find . ! -path ./merged-file -type f -exec cat {} + > merged-file

하지만 파일 목록은 정렬되지 않으며 숨겨진 파일이 포함되어 있다는 점에 유의하세요. -type f이는 다음으로 제한됩니다.정기적인다른 유형의 파일을 포함할 가능성이 낮기 때문입니다. GNU를 사용하면 일반 파일에 대한 심볼릭 링크도 포함 find하도록 이를 변경할 수 있습니다 .-xtype f

zsh 쉘을 사용하여,

cat ./**/*(-.) > merged-file

동일한 작업을 수행하지만( (-.)구현과 동일 -xtype f) 정렬된 목록을 제공하고 숨겨진 파일을 제외합니다( D다시 가져오려면 한정자를 추가함). zargs이 문제를 해결하는 데 사용할 수 있습니다매개변수 목록이 너무 깁니다.실수.

답변2

파일이 동일한 디렉터리에 없으면 연결하기 전에 find 명령을 사용할 수 있습니다.

find /path/to/directory/ -name *.csv -print0 | xargs -0 -I file cat file > merged.file

파일이 이미 정렬되어 있고 분석을 위해 병합하려는 경우에 유용합니다.


휴대성이 향상되었습니다.

find /path/to/directory/ -name *.csv -exec cat {} + > merged.file

파일 순서가 유지될 수도 있고 유지되지 않을 수도 있습니다.

답변3

주문하다

$ cat * > merged-file

실제로 연결에 "병합된 파일"을 포함하여 런어웨이 파일을 생성하는 바람직하지 않은 부작용이 있습니다. 이 문제를 해결하려면 병합된 파일을 다른 디렉터리에 쓸 수 있습니다.

$ cat * > ../merged-file

또는 패턴 일치를 사용하여 병합된 파일을 무시합니다.

$ cat *.txt > merged-file

답변4

다음과 같이 파일을 지정한 pattern다음 모든 파일을 병합할 수 있습니다.

cat *pattern* >> mergedfile

관련 정보