
2026/10/01 0:44
cp: 「-r」か「-R」か?
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
中心的なメッセージは、GNU システムと BSD システムの間で、再帰フラグ(例:
-R、-r、および --recursive)に関する歴史的な分断が存在することである。1992 年(GNU coreutils の最初のコミットにおいて)、cp -R と cp -r は異なる振る舞いを示していたが、2002 年に GNU ではこれらのオプションを統合し、-R、-r、および --recursive はいずれもディレクトリを再帰的にコピーするようにされた。一方、BSD を派生としたシステムでは区別を維持しており、OpenBSD 7.9 のマニュアルには -R のみが記載され、-r は強く推奨されていない。そのコードにおいても Rflag と rflag が区別されており、NetBSD も同様の振る舞いを示す。ユーティリティ chown は -R を使用するが、-r はサポートしていない。POSIX.1-2024 は、-r が BSD および BSD 派生システムでの歴史的な慣習であることを認めつつ、標準仕様から -r はもはや指定されていない(ただし一部の実装では見られる可能性がある)と述べている。また、一貫性の確保のため他の再帰的ディレクトリ降下オプションとの整合性を取るよう、-R を使用するよう推奨している。ハイブリッド環境を管理する管理者は、統合された振る舞いを前提としたスクリプトの使用を避けるべきであり、異なるオペレーティングシステム間での失敗を防ぐため、新規の開発ではデフォルトで POSIX に準拠し -R を用い、小文字フラグへの依存度を必要以上に後方互換性が要求されない限り段階的に廃止すべきである。本文
cp
コマンドで -R
と -r
の違い:なぜ使い分けるべきか?
cp-R-r結論:現代では選択肢は一つに統一されています
現在、GNU Coreutils では
-R および -r の両オプション間に実質的な違いはありません。最新のドキュメントによれば、両者は以下のように機能します。
,-R
,-r--recursive- ディレクトリを再帰的にコピーする
歴史的経緯:34 年前の差別的仕様
かつてはこれらのオプションに明確な違いが存在しました。1992 年(34 年前)の GNU Coreutils の最初のコミットを確認すると、以下の処理が行われていました。
case 'r': flag_recursive = 1; flag_copy_as_regular = 1; // ファイルを通常扱いとしてコピー break; case 'R': flag_recursive = 1; flag_copy_as_regular = 0; // 特殊な処理(当時の文脈) break;
かつての
-r はファイル構造を平たく展開する傾向がありましたが、これは34 年前の話。現在でもこの振る舞いを維持しているシステムは存在しません。2002 年に両オプションが統合され、現在の標準環境では旧来の違いは無視されています。
推奨される記法:POSIX 標準への適合性
他のオペレーティングシステムや標準規格を見ると、
を使用すべきである理由が明確になります。-R
OpenBSD と NetBSD
OpenBSD 7.9 や NetBSD 11 では、公式ドキュメント(man ページ)およびソースコードにおいて
-r の使用は強く推奨されておらず、-R が標準的です。内部実装では Rflag と rflag が別々の挙動を示す可能性があります。
ユーティリティ間の互換性
-R を使用する利点は、異なるユーティリティ間での一貫性にあります。
- 例:
は標準的に動作しますが、chown -R
はサポートされていません。chown -r
POSIX.1-2024 の姿勢
最新の POSIX 標準は明確に
-R を採用しています。
この標準の以前の実装では、ファイル階層をコピーする
オプションへの対応を含めていました。-rオプションは BSD および BSD 由来のシステムにおける歴史的な慣行です。 POSIX.1-2024 ではこのオプションはもはや規定されていませんが、いくつかの実装では存在し続ける可能性があります。 一方、-rオプションは-Rオプションとのほぼ同義として追加され、本書の POSIX.1-2024 に含まれる他の再帰的ディレクトリ降下を行うすべてのオプションと一貫性を保つために選択されました。-r
まとめ
| 項目 | 結論 |
|---|---|
| 現代の GNU | と は機能同等だが、 が推奨される |
| BSD システム | は歴史的慣習だが、現在は -R が標準 |
| 将来性 | POSIX 標準では は廃止予定であり、-R で統一するべき |
迷ったら、いつでも -R を使用してください。