Linuxで複数ファイルを順に表示する基本はcat -- file1.txt file2.txt、新しいファイルへ保存する基本はcat -- file1.txt file2.txt > combined.newです。catは指定順に各入力のバイトを標準出力へコピーし、区切り文字や改行を自動追加しません。出力先を入力と同じファイルにすると、シェルの>がcat起動前に出力先を0バイトへ切り詰め、データを失います。出力は入力群と別名・別ディレクトリの新規ファイルへ作り、順序、境界、終了状態、サイズ、ハッシュ、内容を確認してから利用します。
catは連結して標準出力へ書く
GNU Coreutilsのcatは、各fileをコマンドラインに現れた順で標準出力へコピーします。cat -- chapter1.txt chapter2.txtならchapter1の全バイトに続いてchapter2の全バイトを表示します。--はオプションの終端で、-draft.txtのような名前を誤解しないために使えます。ファイル名自体は必ず引用または個別引数にします。
catはテキストの意味、文字コード、ヘッダー、行番号を理解して結合するデータ変換ツールではありません。UTF-8とShift_JIS、CSVとJSON、圧縮前後、異なるログ書式をバイト列としてつなげても有効な一ファイルになるとは限りません。入力の形式、文字コード、改行、スキーマを確認し、構造化形式は専用のパーサー/マージツールを選びます。
表示だけならページャーと範囲確認を使う
短い既知のテキストならcatで表示できますが、巨大ファイルを端末へ流すと履歴が埋まり、制御文字や機密情報が見える恐れがあります。最初にstat -- file1.txt file2.txtやwc -c -- file1.txt file2.txtでサイズを読み取り、必要ならless -- file1.txtなどページャーを使います。正体不明ファイルはfileで形式を確認します。
複数ファイルの先頭/末尾を比較するだけならhead/tailを個別に使い、全量を表示しません。ログにはトークン、メール、個人情報が含まれるため、画面共有、端末ログ、CI出力へ無制限に流さないようにします。表示コマンドでもファイルのatimeや監査ログへ影響する可能性を運用要件で確認します。
新規出力へ保存し同一入力を避ける
cat -- header.txt body.txt footer.txt > document.newは新しい出力へ保存する例です。Bashの公式仕様では>はコマンド実行前に出力ファイルを開き、既存なら0サイズへ切り詰めます。したがってcat a.txt b.txt > a.txtはa.txtを先に空にし、元内容を復元できません。
出力名が入力グロブへ含まれる配置も避けます。例えば同じディレクトリでcat *.log > all.logを再実行すると、既存all.logが入力候補に入り、自己取り込みや増大を起こし得ます。出力を別ディレクトリの一時名へ作り、入力一覧を先に確定します。既存成果物へ上書きせず、世代番号や実行IDを付けます。
追記>>は再実行で重複する
>>は既存ファイル末尾へ追記します。定期処理でcat daily.log >> archive.logを毎回実行すると、同じ入力を再度追加する可能性があります。追記が必要なら処理済みの識別、入力ハッシュ、期間、排他、途中失敗の再開点を設計します。単に上書きを避けたい理由で>>へ変えません。
Bashのset -o noclobberは誤上書きの一部を防げますが、追記、明示的>|、競合、入力と出力の同一性を完全には防ぎません。安全策は新しいファイルへ出力し、成功検証後に承認された方法で名前を切り替えることです。元データ、直前成果物、ロールバック先を保持します。
入力順を明示しグロブ順を検証する
cat -- part-1.txt part-2.txt part-10.txtのように明示すれば順序は確定します。一方part-*.txtはシェルがcat起動前に展開し、通常はロケールの照合順になります。字句順ではpart-10がpart-2より先になることがあります。printf '%s\n' part-*.txtで候補順を表示し、期待と比較します。
GNUのバージョン順なら名前中の数字を数値的に扱えますが、自然順に唯一の標準があるわけではありません。入力リストを作ってレビューするか、printf '%s\0' part-*.txt | sort -zVの結果をNUL対応で扱います。ロケールとsort版を記録し、隠しファイル、バックアップ、出力ファイルが候補へ混ざらないことを確認します。
ファイル境界へ改行は追加されない
一つ目の末尾に改行がなければ、二つ目の先頭が同じ行へ直結します。catは修正しません。tail -c 1 -- file1.txt | od -An -t x1などで最終バイトを確認し、テキスト仕様でLFが必要かを判断します。元ファイルを変更せず、結合時に区切りを挿入する要件を明示します。
各ファイルの間へ改行を一つ入れるなら、入力配列を安全に列挙し、各cat後にprintf '\n'する処理を別スクリプトでテストします。ただし元ファイル末尾にも改行があれば空行が増えます。CSVのヘッダー重複、JSON配列の区切り、Markdownの段落境界など、形式固有のルールはcatだけで解決しません。
catの表示オプションを結合データへ混ぜない
cat -nは全行、-bは空でない行へ番号を付け、-Aは行末やタブなどを可視化し、-sは連続空行を一つへします。これらは診断表示には便利ですが、入力バイトをそのまま結合する成果物には不適切です。行番号や可視化記号が実データへ書き込まれるためです。
不可視文字の確認は画面または別の診断ファイルだけへ出し、本番成果物はオプションなしcatで作ります。-vも任意バイナリを安全なテキストへ変換する機能ではありません。バイナリはodやxxdで範囲限定表示します。
標準入力の位置をハイフンで指定する
catでは単独の-が標準入力を表します。cat -- header.txt - footer.txtならヘッダーを出し、端末やパイプからの入力がEOFになるまで待ち、最後にフッターを出します。自動処理で標準入力元が未接続だと待機し続けるため、パイプ構成とタイムアウトを確認します。
ファイル名が文字どおり-なら./-のようにパスを付けます。端末入力を混ぜた成果物は再現しにくいため、重要な処理では標準入力も一度アクセス制限された入力ファイルへ保存し、ハッシュと承認を残します。端末から秘密を貼り付ける場合は履歴や画面共有にも注意します。
検索結果を連結する前にNUL安全な一覧を作る
特定文字列を含むファイル候補はgrep -lZF -- 'marker' ./*.txtのようにNUL区切りで得られます。ただしそのままcatへ渡す前に、候補の件数、順序、重複、所有者、サイズを確認します。改行区切りのgrep -l | xargs catは空白、引用符、改行を含む名前を壊します。
GNUツール同士ならNUL区切りをxargs -0へ渡せますが、xargsは引数上限に応じて複数回実行するため、エラー処理と順序要件を設計します。より厳密にはレビュー済みのNUL一覧を読み取るループまたは配列へし、出力を別ディレクトリへ作ります。検索対象が変化するツリーで、一覧作成と連結の間にファイルが差し替わる競合も考慮します。
tacは各ファイル内の行を逆順にする
tac file1.txt file2.txtは単純に「file2、file1の順でそのまま表示」するコマンドではありません。GNUの仕様では、指定された各ファイルを順に扱い、それぞれのレコード(既定は行)を個別に逆順にして出力します。ファイル順だけを逆にしたいなら入力リストの順を逆にし、catへ渡します。
巨大なパイプ入力などシークできない入力では、tacが一時領域へバッファする場合があります。空き容量と機密データの一時保存を確認します。ログを「新しい順」にしたい目的でも、複数行イベント、タイムゾーン、ローテーション、圧縮を理解せずtacだけで並べ替えません。
終了状態・サイズ・ハッシュで成果物を検証する
連結コマンドの終了状態が0か、標準エラーが空か、出力サイズが入力サイズ合計と一致するかを確認します。区切りを追加した場合はそのバイト数を加味します。sha256sum -- input1 input2 outputを記録し、入力が変更されていないことを確認します。テキストなら先頭、境界、末尾、行数、文字コードをサンプル確認します。
catは内容だけを出力し、元ファイルの所有者、モード、ACL、拡張属性、時刻を成果物へ合成しません。出力先のumaskと権限を確認し、機密入力より緩い権限にしません。検証が失敗した一時ファイルは公開場所へ残さず、元入力を保持して原因を直して再生成します。
確認チェックリスト
- catが引数順にバイト列を連結することを理解した
- 出力先を入力と別名・別ディレクトリへ作った
- グロブ展開後の入力一覧と順序を確認した
- 末尾改行とファイル境界を確認した
- 追記による再実行重複を防いだ
- 診断用catオプションを成果物へ混ぜていない
- NUL区切りで特殊なファイル名を扱った
- 終了状態・サイズ・ハッシュ・権限を検証した

コメント