我经常想递归地应用一个操作。某些命令(例如 grep)使用小写 r 来指示递归。例如
grep -r foo .
其他命令似乎更喜欢大写 R:
chmod -R 755 .
我经常把这些弄错,忘记哪个是哪个。这些论证的案例选择背后有什么逻辑吗?
答案1
大多数具有递归目录遍历选项(ls
、chmod
、chgrp
、chmod
、cp
、rm
)的 POSIX 命令都具有-R
此功能。
rm
也有,-r
因为这就是它最初的样子,早在 POSIX 之前。
现在,当沿着树走下去时发现符号链接时,行为会有所不同。 POSIX 试图通过添加-L
//选项来使事情保持一致-H
,P
让用户有机会决定如何处理符号链接,在没有提供未指定的情况下保留默认值。
POSIXgrep
没有-r
或-R
.
GNUgrep
最初两者都没有。-r
于 1998 年添加。这是在符号链接之后。
-R
为了与其他实用程序保持一致,于 2001 年添加为同义词。那仍然遵循符号链接。
在 2012 年(grep 2.12),-r
被更改,因此它不再遵循符号链接,可能是因为-L
,-H
已用于其他用途。
BSDgrep
长期以来都基于 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] 保持谨慎。”