私はしばしばタスクを再帰的に適用したいと思います。 grepなどの一部のコマンドは、小文字のrを使用して再帰を表します。例えば
grep -r foo .
他のコマンドは大文字Rを好むようです。
chmod -R 755 .
私はしばしばこれを間違って理解し、どちらがどれであるかを忘れます。これらの主張のケース選択の背後にはどのようなロジックがありますか?
答え1
再帰ディレクトリナビゲーションオプション(、、、、、、、、ls
)を持つほとんどのPOSIXコマンドには、この機能があります。chmod
chgrp
chmod
cp
rm
-R
rm
はい、-r
POSIX以前はもともとそうだったからです。
ツリーのナビゲーション中にシンボリックリンクが見つかると、動作は異なります。 POSIXは、ユーザーがシンボリックリンクをどのように処理するかを決定する機会を提供するために、//オプションを追加して指定しなかった場合、デフォルト値をそのまま維持して-L
一貫性を維持しようとしました。-H
P
POSIXにはまたgrep
はがありません。-r
-R
GNUはもともとgrep
両方ではありませんでした。-r
1998年に追加されました。これはシンボリックリンク以降です。
-R
他のユーティリティとの一貫性のために、2001年に同義語として追加されました。それはまだシンボリックリンクに従います。
2012年(grep 2.12)では、もはや-r
シンボリックリンクに従わないように変更されました。それはおそらくgrepが他の目的に使用され-L
たためです。-H
BSDはgrep
長い間GNU grepに基づいていました。それらのいくつかは独自のバージョンを書き直し、GNUとの互換性をある程度維持しましたgrep
。 Apple OS / Xはシンボリックリンクの問題を異なる方法で解決します。同じで、シンボリックリンクに従わない-r
。ただし、シンボリックリンクをたどる // 'オプションと同様に機能するオプションが-R
あります。-S
chmod
cp
find
-L
答え2
まったく。単に開発者の選択に依存します。通常、これは両方とも有効なオプションである-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
。-r
指摘作者:@Arkadiusz Drabczykso)、したがって実際には使用できません。
答え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
答え4
20年前にUNIXを学ぶとき、メンターはこう言いました。 「再帰オプションを常に大文字Rとして入力することをお勧めします。一部のコマンドは小文字rオプションとは異なる意味を持ちますが、大文字Rはほとんど再帰オプションに使用されます。Rを入力するとShiftキーを押す習慣があるため、[ rm * -Rf]に注意してください。