web-dev-qa-db-ja.com

シェルからLinuxでファイルを別のファイルに追加する方法

file1file2という2つのファイルがあります。 file2の内容がプロセスを持続するようにfile1の内容をfile1に追加するにはどうすればよいですか?

387
asir
567
David

cat file2 >> file1

>>演算子は、名前付きファイルに出力を追加するか、名前付きファイルが存在しない場合は作成します。

cat file1 file2 > file3

これは2つ以上のファイルを1つに連結します。必要なだけの数のソースファイルを持つことができます。例えば、

cat *.txt >> newfile.txt

更新20130902
コメントの中で、eumiroは「cat file1 file2 > file1を試してはいけない」と提案しています。期待される結果にならない可能性がある理由は、リダイレクトを受け取るファイルが>の左側のコマンドが実行される前に準備されているためです。この場合、最初にfile1がゼロ長に切り捨てられて出力用に開かれ、次にcatコマンドが、現在ゼロ長のファイルとfile2の内容をfile1に連結することを試みます。その結果、file1の元の内容が失われ、代わりにfile2のコピーが作成されますが、これはおそらく予期されていたものではありません。

更新20160919
コメントの中で、tparteeは裏付け情報/情報源へのリンクを示唆している。信頼できる参考文献として、linuxcommand.orgにある shのmanページ に親切な読者を誘導します。

コマンドが実行される前に、その入力と出力はシェルによって解釈される特別な表記法を使用してリダイレクトされるかもしれません。

それが読者に彼らが知っている必要があることを知らせている間あなたがそれを探していない、そしてステートメントをWord by Wordでパースしていないなら見逃すのは簡単です。ここで最も重要な言葉は「前」です。リダイレクトが完了した(または失敗した)beforeコマンドが実行された。

cat file1 file2 > file1の例の場合、シェルは最初にリダイレクトを実行するので、コマンドが実行される前にコマンドが実行される環境にI/Oハンドルが配置されます。

リダイレクトの優先順位が詳細に説明されている、よりわかりやすいバージョンは、Linuxコースウェアの形でIan AllenのWebサイトにあります。彼の I/Oリダイレクションに関する注意事項 ページには、コマンドがなくてもリダイレクションが機能するという観察も含めて、このトピックに関して多くのことを述べています。これをシェルに渡します。

$ >out

... outという名前の空のファイルを作成します。シェルは最初にI/Oリダイレクトを設定してからコマンドを探し、コマンドを見つけないで操作を完了します。

283
T.Rob

Sudo を使用する必要がある場合は、次の手順を実行します。

Sudo bash -c 'cat file2 >> file1'

特権のエスカレーションは出力のリダイレクトに引き継がれないため、単にコマンドの前にSudoを付けるという通常の方法は失敗します。

39
jdunk

このコマンドを試してください。

cat file2 >> file1
27
eumiro

あなたが求めるコマンドは

cat file2 >> file1
22
jmatraszek

参考までに、ddrescueを使用すると、たとえば大きなファイルがある場合や一時停止して後から続行する必要がある場合に、タスクを実行するための中断可能な方法が提供されます。

ddrescue -o $(wc --bytes file1 | awk '{ print $1 }') file2 file1 logfile

logfileは重要なビットです。 Ctrl-Cでプロセスを中断して、まったく同じコマンドをもう一度指定して再開すると、ddrescueはlogfileを読み取り、中断したところから再開できます。 -o Aフラグは、出力ファイル(file1)のバイト _ a _ から開始するようにddrescueに指示します。そのため、wc --bytes file1 | awk '{ print $1 }'file1のサイズをバイト単位で抽出するだけです(必要に応じてlsからの出力を貼り付けることもできます)。

コメントで ngks で指摘されているように、ddrescueはおそらくデフォルトではインストールされないため、手動でインストールする必要があります。他の複雑さはあなたのリポジトリにあるかもしれないddrescueの2つのバージョンがあるということです: このaskubuntuの質問を見てください 詳細については/。あなたが望むバージョンはGNU ddrescueであり、Debianベースのシステムではgddrescueという名前のパッケージです。

Sudo apt install gddrescue

他のディストリビューションの場合は、パッケージ管理システムで _ gnu _ バージョンのddrescueを確認してください。

13
Zorawar

別の解決策:

cat file1 | tee -a file2

teeには、好きなだけファイルに追加できるという利点があります。次に例を示します。

cat file1 | tee -a file2 file3 file3

file1の内容をfile2file3およびfile4に追加します。

Manページから:

-a, --append
       append to the given FILEs, do not overwrite

これについてはわかりませんが、多くの人がここでcatコマンドを使用して単一のファイルの内容を表示するのは良い習慣ではなく、誰かが this リンクを私と共有していると言っています。

これらすべてを考慮して、次の方法の方が良いようです。

echo -n "$(<file1)" >> file2
0
Mihir

catを使わずにこれを行うこともできますが、正直なところcatのほうが読みやすくなります。

>> file1 < file2

>>file1 _ stdin _ を追加し、< _ stdin _ file2をダンプします。

0
Alok Singh

catは簡単な解決策になることができますが、大規模なファイルを結合すると非常に遅くなります。find -printはあなたを救うためですが、一度catを使わなければなりません。

amey@xps ~/work/python/tmp $ ls -lhtr
total 969M
-rw-r--r-- 1 amey amey 485M May 24 23:54 bigFile2.txt
-rw-r--r-- 1 amey amey 485M May 24 23:55 bigFile1.txt

 amey@xps ~/work/python/tmp $ time cat bigFile1.txt bigFile2.txt >> out.txt

real    0m3.084s
user    0m0.012s
sys     0m2.308s


amey@xps ~/work/python/tmp $ time find . -maxdepth 1 -type f -name 'bigFile*' -print0 | xargs -0 cat -- > outFile1

real    0m2.516s
user    0m0.028s
sys     0m2.204s
0
Amey Jadiye