텍스트 파일을 결합하는 방법?


21

많은 문서를 txt로 저장했습니다. 함께 인쇄하여 먼저 단일 파일로 함께 인쇄하고 싶습니다. 이 경우 순서는 중요하지 않습니다.

병합 할 파일 이름을 입력하지 않고 폴더 내의 모든 txt 파일을 병합하는 솔루션을 원합니다.

명령이나 GUI로 할 수 있습니까?


나는 여기를 보았다 . 사용법을 모른다 join.

답변:


43

cat출력 리디렉션과 함께 사용하십시오 . 구문 : cat file [file] [[file] ...] > joined-file.

두 개의 파일 만있는 예 (더 많은 것을 가질 수 있음) :

$ echo "some text in a file" > file1
$ echo "another file with some text" > file2
$ cat file1 file2 > mergedfiles
$ cat mergedfiles
some text in a file
another file with some text

"많은 문서"가있는 경우 쉘 글 로빙 (패턴)을 사용하십시오.

cat input-files-dir/* > joined-file

그러면 해당 디렉토리의 모든 파일이 현재 디렉토리에 결합됩니다 (출력 파일 자체와 일치하지 않도록). 그것은 cat출력 리디렉션 의 사용 및 출력과 완전히 독립적입니다. Bash는 모든 파일을 인수로 제공합니다 cat.


파일 형식

종이와 테이프를 사용하는 것처럼 파일을 서로 붙이기 만하면됩니다. 이를 처리 할 수있는 실제 파일 형식은 신경 쓰지 않습니다. 텍스트 파일에는 작동하지만 PDF, ODT 등에는 작동하지 않습니다. 글쎄, 서로 붙어 있지만 더 이상 유효한 PDF / ODT는 아닙니다.


가입 순서

포이보스가 지적한 것처럼 쉘 글 로빙은 알파벳 순서로 파일 이름을 만듭니다. 이것이 Bash와 shell globbing이 작동하는 방식입니다.


에 대한 부록 input file is output file오류

입력 파일의 패턴이 출력되는 파일과 동일한 파일과 일치하면 오류가 발생합니다. 안전 기능입니다. 예:cat *.txt > out.txt 두 번째로 실행하면이 문제가 발생합니다.

당신이 할 수있는 일 :

  • 실제 입력 파일과 일치하고 출력 이름과 일치하지 않는보다 구체적인 패턴을 선택하십시오. 예 : *.txt출력 파일 output.out이있는 입력 파일 패턴 이 충돌하지 않습니다.
  • 다른 디렉토리에서 작업하십시오. 위의 예제에서는 별도의 input-files-dir디렉토리를 사용하여 모든 파일을 배치하고 현재 작업 디렉토리로 출력했습니다. 이 오류가 발생하지 않습니다.

@cipricus 네, 그러나 그것은 매우 기본적인 쉘 글 로빙입니다 (패턴). ls일치 하는 것을 나열하기 위해 패턴을 사용해보십시오 . 예 ls *.txt를 들어 무엇이 일치하는지 확인하십시오.
gertvdijk

2
@cipricus cat * .txt> JoinedFile.txt는 어떻습니까?
Sadi

1
이것은 좀 더 상식적입니다. cat은 먼저 모든 .txt 파일을 포착하고 두 번째로 파일을 결합하고 세 번째는 첫 번째 단계에서 포착 할 수없는 새 .txt 파일을 생성합니다. ;-)
Sadi

1
@cipricus 파일 만 조인합니다. 접착제와 테이프로 종이 조각을 사용하는 것처럼! 압축 된 PDF와 같은 대부분의 "문서"파일 형식은이를 허용하지 않습니다. PDF 편집기를 사용하십시오. 그러나 어쨌든 귀하의 질문은 텍스트 파일 에 관한 것 입니다.
gertvdijk

1
나는 당신이 제안한 방법 (서브 디렉토리 생성, 파일 이동 및 결합)이 더 나은 방법 일 수 있음을 완전히 이해합니다. 그러나 현재 디렉토리의 모든 텍스트 파일 (모두 .txt 확장자)을 결합하려면 cat * .txt> JoinedFile.txt가 완벽하게 작동합니다. 방금 호기심으로 테스트했으며 작동하지만 cipricus도 동일한 결과를 찾았습니다. (그리고이 시스템은 당신이 ;-) 도구 모음없이 이러한 의견에 서식을 사용할 수있는 방법이 초보자를 가르 칠 수있는, 그렇지 않으면 내가 물어 것, 우리가 여기에서 채팅되어서는 안된다는 불평하기 시작했다
사디

12

간단한 방법은 cat을 사용하는 것입니다.

cat file1 file2 > joined_file

방금 발행 cat file1 file2하면 표준 출력에 두 파일이 모두 표시됩니다. 를 사용 >하면 표준 출력을 파일로 리디렉션합니다. 다른 명령에서도 작동합니다.


질문을 읽으십시오. OP가 원하지 않는 개별 파일 이름을 지정하려고합니다!
Sri

2
그것은 원래의 질문 에 없었 습니다. 더 완전한 답변이 표시되었으므로 답변을 업데이트하지 않았습니다.
Jorge Suárez de Lis

@ JorgeSuárezdeLis이 답변이 OP의 질문에 직접적으로 도움이되는 것은 아니지만이 답변은 병합하려는 파일이 몇 개인 다른 사람에게 도움이 될 수 있습니다. (오 헤이, 나처럼! 감사합니다! ^-^) +1
Souta

@ JorgeSuárezdeLis 실제로. 질문의 개정 2 에 완벽하게 대답했습니다 . 몇 분 후 개정 3 에서 답변에 대한 요구 사항이 변경되었습니다.
gertvdijk

5

간단한 루프로 수행하십시오.

for i in *.txt; do cat "$i" >> complete.txt; done

>> 파일에 추가합니다.

참고 : 어떤 이유로 명령을 다시 실행 해야하는 경우을 제거해야합니다 complete.txt. 그렇지 않으면 파일을 자체에 쓰면 작동하지 않습니다.


5
이것도 잘 작동하지만에 인수를 사용할 수 있다면 for 루프가 필요하지 않습니다 cat.
gertvdijk

1
예, 물론입니다. 나는를 사용하여 격렬한 순서에 대해 잘 모르겠습니다 cat *.txt. for 루프가 정렬되어야합니다.
phoibos


예, 똑같은 쉘 글러브입니다. forBash 에서 사용하든 다른 곳 에서 사용하든 상관 없습니다 .
gertvdijk

4

결합하려는 파일이 모두 끝날 .txt경우 간단하게 유지하십시오.

cat *.txt > combined.txt

디렉토리에 텍스트 파일 만 포함되어 있으면 간단합니다.

cat * > combined.txt

(일단 생성 한 combined.txt후에는 다시 확장 *하면 이상한 동작이 발생합니다).

디렉토리에서 다른 파일이 아닌 일부 파일을 선택하려면 파일 이름을 사용하여 원하는 파일을 구별하는 것이 가장 좋습니다. 그렇지 않다면, 당신은 멋지게 얻을 수 있습니다 find. 그러나 나는 당신이 그렇게 멀리 가야한다고 의심합니다.


thnx. 수락 된 답변에 대한 의견을 보면 Sadi는 의견에 정확하게 제안했습니다. 당신의 대답이 첫 번째 였다면 당신의 것이 내가 필요했을 것입니다.

피드백 감사드립니다. 그래, 지금 알 겠어, 조금 가려
졌어

4

cipricus가 작성한 Thunar 사용자 지정 동작 스크립트 도 비슷한 Nautilus 스크립트 를 작성하도록 영감 을 주었으며이 주제에 대해이 Q & A를 보는 다른 사람들에게 유용 할 것으로 생각했습니다. 그래서 여기 있습니다 :

#!/bin/sh
#Nautilus Script to join selected text files in a single file and open the joined file with default text editor
#
IFS=$'\n'
FILENAME="JoinedFile_$(date +%Y-%m-%d-%H-%M-%S).txt"
cat "$@" > "$FILENAME"
xdg-open "$FILENAME"

@David Foerster 편집 해 주셔서 감사합니다. 이전 버전 (제한된 테스트 사례 포함)에 아무런 문제가 없었 으며이 개선 된 버전에도 아무런 문제가 없습니다. 이전 버전의 결함으로 인해 불편을 드려 죄송합니다.
Sadi

결함이 없었지만 불필요한 루프가 포함되어있어 코드를 이해하기가 더 어려워졌습니다.
David Foerster

2

이는 Thunar의 사용자 지정 작업에 이러한 솔루션을 적용하는 것과 관련하여 다른 답변에 대한 보완 및 변형입니다.

그들 모두가 이런 식으로 사용 가능한 것은 아니지만 일부는 사용 가능합니다.

Thunar의 상황에 맞는 메뉴에서 선택한 파일병합 하는 것이 가장 흥미로운 것이라고 생각했습니다 .

이것은 gertvdijk답변 에 대한 주석에서 Sadi 가 제안한 것과 다른 변형입니다 .

   cat %N > JoinedFile

선택된 파일 만 합류합니다. 모양 조건을 텍스트 파일로 제한합니다.

여기에 이미지 설명을 입력하십시오

여기에 이미지 설명을 입력하십시오


특별 감사에 사디 그의 코멘트와 함께 나에게 제공되는 가장 명확하고 최대 - 투 - 포인트 솔루션 내 문제.

나는 gertvdijk대답 을 결정적인 것으로 받아 들였다 . 그것은 Sadi의 의견에 대한 기회 일뿐만 아니라 다른 사람들에게 더 가치있는 것으로 보이며, 논쟁의 여지가 있고 완전한 솔루션을 제공합니다 (CLI 읽기 기술보다 다소 높음).


2

당신은 find또한 명령을 시도 할 수 있습니다

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

.txt현재 디렉토리 내에서 파일을 찾고 cat각 발견 된 파일에서 명령을 실행 합니다. 마지막으로 전체 출력이 파일 이름으로 리디렉션되었습니다 file(현재 직접 생성됨).

설명:

.                  # current directory

-name              # helps to find only .txt files.

-type f            # Only files

-exec cat {} +     # helps to run cat command on the founded .txt files.

>                  # Output redirection operator

file               # to store final output.

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