spongeでファイルの先頭に別ファイルを追加する

  • Bash
  • Linux

この記事は、構成と文章の整理にAIを使っています。
あくまで読みやすくするための補助で、内容そのものをAIにすべて任せて書いているわけではありませんが、ところどころ相談しながら整えています。

あるファイルの先頭に別のファイルの内容を追加したい場合、moreutilsのspongeを使うと一番短く書ける。

ターミナル
cat header.txt file1.txt | sponge file1.txt

spongeは標準入力を全部読み切ってから出力先ファイルに書き込むコマンド。パイプの出力を直接同じファイルに書けるので、cat ... > temp.txt && mv temp.txt file1.txtのような中間ファイルを自分で用意する必要がない。中間ファイル名の衝突を気にしなくていいし、書き込みタイミングもsponge側で制御される。

moreutilsパッケージに含まれているので標準では入っていない。Debian/Ubuntuならapt install moreutils、macOSならbrew install moreutilsで入る。

対象がシンボリックリンクの場合、spongeはリンク先のファイルに書き込む(リンク自体は維持される)。mvを使う方法だとリンクが普通のファイルに置き換わって消えるので、この点はspongeの方が安全。

sponge が使えない場合

moreutilsが入っていない環境では従来通りcatとmvを組み合わせる。

ターミナル
cat header.txt file1.txt > temp.txt && mv temp.txt file1.txt

この場合はtemp.txtという名前がカレントディレクトリで衝突しないか注意する。mktempで一時ファイル名を生成した方が安全。またシンボリックリンクはmvで置き換わって消える点も上記の通り。