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


21

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

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

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


ここを見ました。使い方がわからないjoin

回答:


43

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


ファイルタイプ

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


入会の順番

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


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

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

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

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

@cipricusはい、しかしそれは非常に基本的なシェルグロビング(パターン)です。ls一致するものだけをリストするために使用してパターンを試してください。たとえばls *.txt、何が一致しているかを確認します。
gertvdijk

2
@cipricus cat * .txt> JoinedFile.txtはどうですか?
サディ

1
これは実際の常識です。catは最初にすべての.txtファイルをキャッチし、2番目にそれらを結合し、3番目に最初のステップではキャッチできない新しい.txtファイルを作成します;
サディ

1
@cipricusファイルを結合するだけです。あなたが接着剤とテープで紙片を使用することによってあなたがするように!圧縮されているPDFのようなほとんどの「ドキュメント」ファイル形式では、これが許可されていません。PDFエディターを使用します。とにかく、あなたの質問はテキストファイルに関するものでした。
gertvdijk

1
あなたが提案する方法(サブディレクトリを作成し、ファイルを移動してから結合する)が、場合によってはより良い方法かもしれないことを完全に理解しています。ただし、現在のディレクトリ内のすべてのテキストファイル(拡張子はすべて.txt)だけを結合する場合は、cat * .txt> JoinedFile.txtが完璧に機能します。好奇心から試してみたところ、うまくいきました。cipricusも同じ結果を見つけたようです。(システムはここでチャットするべきではないと不平を言い始めました。さもなければ、この初心者にツールバーなしでこれらのコメントのフォーマットを使用する方法を教えることができるかどうか尋ねます;
Sadi

12

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

cat file1 file2 > joined_file

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


質問を読んでください。個々のファイル名を指定するように指示していますが、これはOPが特に望んでいないものです!
シュリ

2
それは元の質問にはありませんでした。より完全な回答が表示されたため、回答を更新していません。
ホルヘスアレス

@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 で使用するか、Bashの他の場所で使用するかは関係ありません。
gertvdijk

4

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

cat *.txt > combined.txt

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

cat * > combined.txt

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

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


thnx。受け入れられた答えへのコメントを見ると、サディはコメントでそれを正確に提案しました。あなたの答えが最初だったなら、あなたの答えは私が必要なものだっただろう。あまりに鉱山を見てみましょう:追加カスタムメニューであること

フィードバックをお寄せいただきありがとうございます。ええ、私は今それを見る、それは少しあいまいだった
...-アレクシス

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編集ありがとうございます。古いバージョン(問題のあるテストケース)には問題がなく、この改善されたバージョンにも問題はありません。以前のバージョンの欠陥により不便をおかけして申し訳ありません。
サディ

欠陥はありませんでしたが、不必要なループが含まれていたため、コードが理解しにくくなりました。
デビッドフォースター

2

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

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

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

これは、gertvdijk答えに対するコメントでSadiが提案したものとは異なります

   cat %N > JoinedFile

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

ここに画像の説明を入力してください

ここに画像の説明を入力してください


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

私は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.