プログラミング
cp: -r または -R?
要約
GNU coreutilsにおける`cp`コマンドの`-r`オプションと`-R`オプションの違いについて解説しています。現代のGNU coreutilsでは両者に違いはありませんが、1992年の初期バージョンでは区別がありました。OpenBSDやNetBSDでは現在も違いがあり、POSIXは一貫性の観点から`-R`を推奨しています。
全文翻訳
blog - git - desktop - contact
cp: -r または -R?
2026-09-30
このような質問が最近また出てきました。以前、答えを探そうとしたことがありましたが、10年ほど前にどこかの「フォーラム」に投稿しただけで、このちょっとしたトリビアをデジタル・ニルヴァーナから救い出す価値があると思います。
現代では、GNU coreutilsのこれら2つのオプションに違いはありません。現在のマニュアルページには次のように書かれています。
-R, -r, --recursive ディレクトリを再帰的にコピーする
常にそうだったのでしょうか? GNU coreutils(1992年)の最初のコミットを見てみましょう。src/cp.cには次のようなコードがあります。
case 'r':
flag_recursive = 1;
flag_copy_as_regular = 1;
break;
case 'R':
flag_recursive = 1;
flag_copy_as_regular = 0;
break;
したがって、当時、確かに違いがありました。しかし、それは34年前のことです。今日、それはまだ関連性があるのでしょうか?おそらくそうではありません。なぜなら、10年後の2002年に両方のオプションがマージされ、誰も24年前のcoreutilsを実行していないからです。
他のシステムはどうでしょうか? OpenBSD 7.9はマニュアルに`-R`のみを記載しており、`-r`の使用を強く推奨していません。ただし、`-R`とはまだ異なる動作をすると述べています。コードをざっと見ると、いくつかの違いが見つかります(Rflagとrflagを検索してください)。NetBSD 11も同様で、マニュアルページとOpenBSDのようなコードです。
`-R`の利点は、ユーティリティ間でより一貫性があることです。例えば、`chown`は`-R`を知っていますが、`-r`は知りません。
POSIXもこれを認識しており、`-R`を推奨しています。
この標準の以前のバージョンには、ファイル階層をコピーするための`-r`オプションのサポートが含まれていました。`-r`オプションは、BSDおよびBSD派生システムにおける歴史的な慣習です。このオプションは、POSIX.1-2024ではもはや指定されていませんが、一部の実装に存在する場合があります。`-R`オプションは、このPOSIX.1-2024のボリュームにある再帰的なディレクトリ下降を行う他のすべてのオプションとの一貫性を選択するために、`-r`オプションの近い同義語として追加されました。