여러 파일의 내용을 하나의 파일에 추가하는 방법


174

다섯 파일의 내용을 그대로 하나의 파일로 복사하고 싶습니다. 각 파일마다 cp를 사용하여 시도했습니다. 그러나 이전 파일에서 복사 한 내용을 덮어 씁니다. 나는 또한 시도했다

paste -d "\n" 1.txt 0.txt

그리고 그것은 작동하지 않았다.

스크립트가 각 텍스트 파일 끝에 줄 바꿈을 추가하고 싶습니다.

예. 파일 1.txt, 2.txt, 3.txt. 1,2,3의 내용을 0.txt에 넣습니다.

어떻게합니까?



또 다른 답변은 여기에 있습니다 : stackoverflow.com/questions/2576693/…
Nikos C.

답변:


308

출력 파일에 cat쉘 재 지정 ( >) 과 함께 (연결을위한 축약 형) 명령 이 필요 합니다.

cat 1.txt 2.txt 3.txt > 0.txt

8
>> 맞아야합니까? 또한 왜 내 0.txt 파일의 모든 텍스트 앞에 줄 바꿈이 있습니까?
Steam

1
0.txt의 내용을 보존하겠습니까?
sehe

13
@blasto 그것은 달려 있습니다. 하나의 파일을 다른 파일에 추가 하는 >>데 사용 됩니다 . 여기서 출력 파일에 지정된 내용 으로 덮어 씁니다 . 줄 바꿈에 관해서는 파일의 첫 번째 문자로 줄 바꿈이 있습니까? 을 사용 하여 첫 번째 문자가인지 확인하면 찾을 수 있습니다 . > 1.txtod -c\n
radical7

1
@ radical7 감사합니다. 실제로 내 파일은 foo_1, foo_2, foo_3과 같습니다. cat "$ filename _"{1,2,3} ". txt"코드를 수정하려고했지만 작동하지 않았습니다.
Steam

1
@blasto 당신은 확실히 올바른 방향으로 가고 있습니다. Bash는 {...}파일 이름 일치 형식 을 확실히 허용 하므로 따옴표가 스크립트에서 약간 엉망입니까? 나는 항상 ls쉘에서 이것을 사용하여 이런 일을 시도 합니다. 명령을 올바르게 받으면 그대로 스크립트에 잘라 붙여 넣습니다. -x스크립트에서 옵션이 유용 할 수도 있습니다 . 실행 전에 스크립트에서 확장 된 명령을 에코합니다.
radical7

97

내가 한 것처럼이 게시물을 우연히 발견 한 다른 옵션은 다음을 사용하는 것입니다 find -exec.

find . -type f -name '*.txt' -exec cat {} + >> output.file

필자의 경우 여러 하위 디렉토리를 살펴볼 수있는보다 강력한 옵션이 필요했기 때문에 사용하기로 결정했습니다 find. 세분화 :

find .

현재 작업중인 디렉토리를 살펴보십시오.

-type f

디렉토리 등이 아닌 파일에만 관심이 있습니다.

-name '*.txt'

이름으로 결과 집합을 정리

-exec cat {} +

각 결과에 대해 cat 명령을 실행하십시오. "+"는 하나의 인스턴스 만 cat생성됨을 의미합니다 (thx @gniourf_gniourf)

 >> output.file

다른 답변에서 설명한 것처럼 출력 내용 끝에 cated 컨텐츠를 추가하십시오.


10
이 답변에는 많은 결함이 있습니다. 먼저 와일드 카드 *.txt를 따옴표로 묶어야합니다 (그렇지 않으면 find작성된 전체 명령이 쓸모가 없습니다). 실행 명령이 : 또 다른 결함은 총 오해에서 비롯 되지 않습니다 cat >> 0.txt {} ,하지만 cat {}. 귀하의 명령은 실제로 { find . -type f -name *.txt -exec cat '{}' \; ; } >> 0.txt(그룹화를 추가하여 실제로 무슨 일이 일어나고 있는지 알 수 있습니다)와 같습니다. 또 다른 결점은 find파일을 찾는 것인데 0.txt, 입력 파일이 출력 파일cat 이라고 말함으로써 불평 할 것 입니다.
gniourf_gniourf

수정 해 주셔서 감사합니다. 제 사건은 조금 달랐으며이 사건에 적용되는 그 어떤 문제도 생각하지 못했습니다.
mopo922

찾은 모든 파일에 대해 실행할 >> output.file사람 (자신 포함)을 유도하지 않도록 명령의 끝에 두어야 합니다. findcat {} >> output.file
gniourf_gniourf 16시 39 분

정말 좋아 보이기 시작합니다! 하나의 최종 제안 : -exec cat {} +대신을 사용하여 -exec cat {} \;하나의 인스턴스 만 cat여러 인수로 생성되도록하십시오 ( +POSIX로 지정 ).
gniourf_gniourf

3
좋은 대답과 경고-나는 내 것을 다음 find . -type f -exec cat {} + >> outputfile.txt과 같이 수정했다. 디렉토리가 단지 50 메가인데도 내 출력 파일이 공연장에서 자라지 않는 이유를 알 수 없었다. outputfile.txt를 계속 추가했기 때문입니다! 따라서 파일 이름을 올바르게 지정하거나 파일을 완전히 피하기 위해 다른 디렉토리에 완전히 배치하십시오.
Thisisstackoverflow 2018 년

43

특정 출력 유형이 있다면 다음과 같이하십시오.

cat /path/to/files/*.txt >> finalout.txt

1
병합 순서를 유지할 가능성을 잃어버린 점에 유의하십시오. 예를 들어 파일 이름이 같은 경우에 영향을 줄 수 있습니다. file_1,, file_2file_11, 파일이 정렬되는 자연스러운 순서 때문입니다.
emix

16

모든 파일이 단일 디렉토리에있는 경우 간단하게 수행 할 수 있습니다.

cat * > 0.txt

1.txt, 2.txt, .. 파일은 0.txt로 이동합니다


Eswar가 이미 답변했습니다. 그래도 병합 순서를 유지할 가능성을 잃고 있음을 명심하십시오. 예를 들어, 이름이 같은 파일이있는 경우 영향을 줄 수 있습니다. file_1,, file_2file_11, 파일이 정렬되는 자연스러운 순서 때문입니다.
emix

10
for i in {1..3}; do cat "$i.txt" >> 0.txt; done

952 파일을 하나로 결합해야했기 때문에이 페이지를 찾았습니다. 파일이 많은 경우이 기능이 훨씬 더 좋습니다. 이것은 당신이 필요로하는 많은 숫자에 대해 루프를 수행하고 0을 사용하여 0.txt의 끝에 추가하기 위해 각각을 사용합니다.


bash에서 괄호 확장을 사용하여 고양이 {1,2,3} .txt >> 0.txt를 작성할 수 있습니다.
mcheema

9

모든 파일의 이름이 비슷하면 간단하게 할 수 있습니다.

cat *.log >> output.log

5

다른 옵션은 sed다음과 같습니다.

sed r 1.txt 2.txt 3.txt > merge.txt 

또는...

sed h 1.txt 2.txt 3.txt > merge.txt 

또는...

sed -n p 1.txt 2.txt 3.txt > merge.txt # -n is mandatory here

또는 리디렉션없이 ...

sed wmerge.txt 1.txt 2.txt 3.txt

마지막 줄도 merge.txt( wmerge.txt! 아님) 쓰십시오 . w"merge.txt"파일 이름과 혼동되지 않고 -n자동 출력에 사용할 수 있습니다 .

물론 와일드 카드를 사용하여 파일 목록을 줄일 수도 있습니다. 예를 들어, 위 예제에서와 같이 번호가 매겨진 파일의 경우 다음과 같이 중괄호로 범위를 지정할 수 있습니다.

sed -n w"merge.txt" {1..3}.txt

4

파일에 헤더가 포함 되어 있고 출력 파일에서 헤더 를 제거하려는 경우 다음을 사용할 수 있습니다.

for f in `ls *.txt`; do sed '2,$!d' $f >> 0.out; done

3

원본 파일에 인쇄 할 수없는 문자가 포함되어 있으면 cat 명령을 사용할 때 해당 문자가 손실됩니다. 'cat -v'를 사용하면 인쇄 할 수없는 문자가 표시 가능한 문자열로 변환되지만 출력 파일에는 여전히 원본 파일의 실제 인쇄 할 수없는 문자가 포함되지 않습니다. 적은 수의 파일을 사용하면 인쇄 할 수없는 문자를 처리하는 편집기 (예 : vim)에서 첫 번째 파일을 열 수 있습니다. 그런 다음 파일 맨 아래로 이동하여 ": r second_file_name"을 입력하십시오. 인쇄되지 않는 문자를 포함하여 두 번째 파일을 가져옵니다. 추가 파일에 대해서도 마찬가지입니다. 모든 파일을 읽었 으면 ": w"를 입력하십시오. 결과적으로 첫 번째 파일은 원래 파일과 읽은 파일의 내용을 포함하게됩니다.


이것은 스크립트가 가능하지 않습니다.
FKEinternet

1

3 개의 파일 내용을 하나의 파일에 추가하려면 다음 명령을 사용하는 것이 좋습니다.

cat file1 file2 file3 | tee -a file4 > /dev/null

모든 파일의 내용을 file4에 결합하여 콘솔 출력을로 던집니다 /dev/null.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.