web-dev-qa-db-ja.com

テキストファイルを結合する方法

多くのドキュメントをtxtとして保存しました。私はそれらを一緒に印刷したいので、最初にそれらを一緒に単一のファイルにしたいです。この場合、順序は関係ありません。

マージするファイルの名前を入力するのではなく、フォルダー内のすべてのtxtファイルをマージするソリューションが必要です。

コマンドまたはGUIで実行できますか?


こちら に見えました。 joinの使用方法がわからない。

21
user47206

出力リダイレクトでcatを使用します。構文:cat file [file] [[file] ...] > joined-file

ファイルが2つだけの例(さらに多くのファイルを作成できます):

$ 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の使用と出力リダイレクトとは完全に独立しています-catの引数としてすべてのファイルを提供するだけのBashです。


ファイルタイプ

紙とテープの場合と同様に、ファイルを接着(結合)するだけです。これを処理できる実際のファイル形式は気にしません。テキストファイルでは機能しますが、PDF、ODTなどでは機能しません。まあ、それらを結合しますが、有効なPDF/ODTではなくなりました。


入会の順番

phoibosが指摘した のように、シェルのグロビングはファイル名のアルファベット順になります。これが、Bashとシェルのグロビングの仕組みです。


input file is output fileエラーに関する補遺

入力ファイルのパターンが出力とまったく同じファイルに一致する場合、エラーが発生します。これは安全機能です。例:cat *.txt > out.txt 2回目の実行はこれを引き起こします。

それについてできること:

  • 出力名ではなく、実際の入力ファイルと一致するより具体的なパターンを選択します。例:入力ファイルパターン*.txtと出力ファイルoutput.outは衝突しません。
  • 別のディレクトリで作業します。上記の例では、個別のinput-files-dirディレクトリを使用して、すべてのファイルを現在の作業ディレクトリに配置し、現在の作業ディレクトリに出力しました。これにより、このエラーを取得できなくなります。
43
gertvdijk

これを行う簡単な方法は、catを使用することです。

cat file1 file2 > joined_file

cat file1 file2を発行すると、両方のファイルが標準出力に表示されます。 >を使用すると、標準出力をファイルにリダイレクトするだけです。別のコマンドでも機能します。

12

簡単なループでそれを行います:

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

>>はファイルに追加します。

注:何らかの理由でコマンドを再度実行する必要がある場合は、complete.txtを削除する必要があります。削除しないと、ファイルをそれ自体に書き込むことになり、動作しません。

5
phoibos

結合するファイルがすべて.txtで終わる場合は、単純にしてください:

cat *.txt > combined.txt

ディレクトリにテキストファイルのみが含まれる場合も簡単です。

cat * > combined.txt

combined.txtを一度作成すると、それを再度実行すると*の展開に含まれ、奇妙な動作につながることに注意してください)。

ディレクトリ内の一部のファイルを選択し、他のファイルを選択しない場合は、ファイル名で必要なファイルを区別できるのが最善です。そうでない場合は、findでお洒落になります。しかし、私はあなたがそこまで行く必要があるとは思いません。

4
alexis

Thunarカスタムアクションスクリプトcipricus によって書かれた同様のNautilus scriptそして、私はこの主題に関する参考のためにこの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"
4
Sadi

これは、これらのソリューションをThunarのカスタムアクションで機能させることに関連する、他の回答の補足およびバリエーションです。

これらのすべてがこのように使用できるわけではありませんが、一部は使用可能です。

最も興味深いのは、 Thunarのコンテキストメニューから選択したファイルをマージできることです。

これは gertvdijkanswer へのコメントで Sadi によって提案されたものとは異なります:

   cat %N > JoinedFile

選択したファイルのみが結合されます。外観条件をテキストファイルに制限します。

enter image description here

enter image description here


Sadi に特に感謝します。このコメントは、私の問題に対する最も明確で最新のソリューションを提供してくれました。

gertvdijkanswer を決定的なものとして受け入れました。 Sadiのコメントの機会になっただけでなく、他の人にとってはさらに価値があるようです。

2
user47206

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.
2
Avinash Raj