file1
とfile2
という2つのファイルがあります。 file2
の内容がプロセスを持続するようにfile1
の内容をfile1
に追加するにはどうすればよいですか?
cat file2 >> file1
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リダイレクトを設定してからコマンドを探し、コマンドを見つけないで操作を完了します。
注 : Sudo を使用する必要がある場合は、次の手順を実行します。
Sudo bash -c 'cat file2 >> file1'
特権のエスカレーションは出力のリダイレクトに引き継がれないため、単にコマンドの前にSudo
を付けるという通常の方法は失敗します。
このコマンドを試してください。
cat file2 >> file1
あなたが求めるコマンドは
cat file2 >> file1
参考までに、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を確認してください。
別の解決策:
cat file1 | tee -a file2
tee
には、好きなだけファイルに追加できるという利点があります。次に例を示します。
cat file1 | tee -a file2 file3 file3
file1
の内容をfile2
、file3
およびfile4
に追加します。
Manページから:
-a, --append
append to the given FILEs, do not overwrite
これについてはわかりませんが、多くの人がここでcat
コマンドを使用して単一のファイルの内容を表示するのは良い習慣ではなく、誰かが this リンクを私と共有していると言っています。
これらすべてを考慮して、次の方法の方が良いようです。
echo -n "$(<file1)" >> file2
cat
を使わずにこれを行うこともできますが、正直なところcat
のほうが読みやすくなります。
>> file1 < file2
>>
はfile1
に _ stdin _ を追加し、<
は _ stdin _ にfile2
をダンプします。
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