-rと-Rの違い


32

操作を再帰的に適用したいことがよくあります。grepなどの一部のコマンドでは、小文字のrを使用して再帰を示します。例えば

grep -r foo .

他のコマンドは大文字のRを好むようです:

chmod -R 755 .

私は常にこれらを間違った方法で回避し、どれがどれであるかを忘れています。これらの引数の大文字と小文字の選択の背後にあるロジックはありますか?


1
「コーダーは賢明だと思ったからです。」(これは正当な理由ですが、それはおそらく真実だとは言わない)
HalosGhost

1
価値のあることについては、多くのコマンドが理解--recursiveしているようには見えませんが、間違った動作をする可能性はありません。
タナースウェット14

4
chmodの場合、-rすべてのレベルの読み取りビットを設定解除することを意味しているため
HorusKol 14

回答:


37

再帰的なディレクトリトラバーサルのオプションを持っているほとんどのPOSIXコマンドは(lschmodchgrpchmodcprm)持って-Rいるため。

rmまた-r、POSIXよりもずっと前の初期の状態だからです。

現在、ツリーをたどってシンボリックリンクが見つかったときの動作は異なります。POSIXは、-L/ -H/ Pオプションを追加することにより、一貫性を持たせようとしました。これにより、指定されていないものが何も指定されていない場合、シンボリックリンクをどうするかをユーザーが決定できるようになります。

POSIXはgrepまったくありません-r-R

GNUにgrepは最初はどちらもありませんでした。-r1998年に追加されました。これはシンボリックリンクをたどっていました。

-R他のユーティリティとの一貫性のために2001年に同義語として追加されました。それはまだシンボリックリンクをたどっていました。

2012(グレップ2.12)で、-rもはや可能性があるため、シンボリックリンクをたどらないように変更された-L-Hすでに何か他のもののために使用されました。

BSD grepは長い間GNU grepに基づいていました。それらのいくつかは独自に書き直し、GNUとの互換性をほぼ維持していますgrep。Apple OS / Xは、シンボリックリンクの問題に異なる方法で対処しました。-r-R同じであり、シンボリックリンクをたどらないでください。-Sただし、シンボリックリンクをたどるchmod/ cp/ find-Lオプションのように機能するオプションがあります。


13
TL; DR:歴史。
サミッチ14

10
初期の歴史:rm他の前に再帰的なオプションがありました。でした-r。その後cp、マッチングを得た-r。その後ls、再帰的なオプションが必要でしたが、ls -rすでに「逆ソート」を意味していたため、そうする必要がありました-R。そこで緊張が始まり-R-r始まった。-Rすべての関連ユーティリティに一貫して追加できる唯一のものでしたが、rm -rすでによく知られた従来の使用法でした。それからGNUがやって来て、「一貫性と伝統は正方形のためだ!」と言いました。

8

まったくありません。開発者が選択したものに依存します。両方のため、それはしばしばある-rとは-R有効なオプションです。あなたが引用したプログラムでは、例えば:

  • GNUの最新バージョンgrep

    -r, --recursive
          Read all files  under  each  directory,  recursively,  following
          symbolic  links  only  if they are on the command line.  This is
          equivalent to the -d recurse option.
    
    -R, --dereference-recursive
          Read all files under each directory,  recursively.   Follow  all
          symbolic links, unlike -r.
    
  • chmod-rオプションがないので、おそらく開発者はを好み-Rます。ただし、もちろん、@ Arkadiusz Drabczyksoが指摘し-rように、有効なアクセス許可文字列であるため、そこでは実際には使用できません。


あなたのgrepバージョンは何ですか?GNU grep 2.12、-rおよび-R同じです。chmodでは、-RPOSIXによって定義されます。
cuonglm

@Gnouc grep (GNU grep) 2.15と私は以前のバージョンでこれを見たことを覚えています。あなたには当てはまらないのですか?ほとんどの場合、基本的に同じ結果が得られますが、リンクに対してのみ異なる動作をします。に関してはchmod、POSIXで定義することもできますが、おそらく、元のchmod開発者がを選択Rしたためrです。
テルドン

2
@Gnouc D'oh!明らかに、-rそれは既に有効な許可文字列であるため、使用できませんでした。
テルドン

3

ほとんどの場合、それは開発者の個人的な好みに帰着します。ただし、場合によっては、たとえば再帰的に操作するよりも開発者がより重要だと考えている何かのために、優先される小文字オプションが採用される場合、大文字オプションが選択されます。chmodの場合-r、有効なモードです。例えば:

$ ll FILE
-rw-r--r-- 1 ja ja 0 Sep  9 16:42 FILE
$ chmod -r FILE
$ ll FILE
--w------- 1 ja ja 0 Sep  9 16:42 FILE

1

私は常にこれらを間違った方法で回避し、どれがどれであるかを忘れています。

可能であれば、これらのユーティリティのGNUバージョンを使用してから、オプションに長い名前を使用できます。

command --recursive

これらの引数の大文字と小文字の選択の背後にあるロジックはありますか?

いや

あまりない。Unixユーティリティは部分的に開発され、コマンドオプションはリードまたは単独の開発者の個々の選択を反映しています。ASCII小文字オプション文字は26個しか使用できません。これは優先セットであり(コマンドは入力しやすいように通常小文字です)、この限定されたセットはニーモニックの競合につながります。コマンド/ユーティリティの新しいバージョンに新しい機能が追加されたため、競合により矛盾が発生します


-1

20年前、私がUNIXを学んだとき、私の指導者はこう言いました。「再帰オプションは常に大文字のRで入力した方がいいでしょう。また、Rを入力するときにShiftキーを押すのが面倒なので、[rm * -Rf]に注意するのが良い習慣になります。」


2
非標準のオプションはツールの実装ごとに異なる可能性があるため、あなたが使用している特定のシステムのコマンドのマニュアルを読むように彼に言ったらよかったでしょう。
クサラナナンダ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.