我经常需要递归地应用操作。某些命令(例如grep)使用小写字母r表示递归。例如
grep -r foo .
其他命令似乎更喜欢大写的R:
chmod -R 755 .
我不断地以错误的方式解决这些问题,而忘记了哪一个。在为这些论据选择大小写的背后有逻辑吗?
--recursive
,但它们不太可能做错事。
-r
意味着要取消所有级别的读取位
我经常需要递归地应用操作。某些命令(例如grep)使用小写字母r表示递归。例如
grep -r foo .
其他命令似乎更喜欢大写的R:
chmod -R 755 .
我不断地以错误的方式解决这些问题,而忘记了哪一个。在为这些论据选择大小写的背后有逻辑吗?
--recursive
,但它们不太可能做错事。
-r
意味着要取消所有级别的读取位
Answers:
有递归遍历目录选项的大多数POSIX命令(ls
,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
进行了更改,因此不再遵循符号链接,可能是因为-L
,该链接-H
已用于其他用途。
BSD grep
基于GNU grep已有很长时间了。其中一些已经重写了自己的版本,并与GNU或多或少保持了兼容性grep
。Apple OS / X解决符号链接问题的方式有所不同。-r
并且-R
是相同的,并且不遵循符号链接。-S
但是,有一个选项的行为类似于chmod
/ cp
/ find
的-L
选项以跟随符号链接。
没有任何。它仅取决于开发人员的选择。通常是因为-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 所指出的),因此不能在此处真正使用它。
grep
版本是?GNU grep 2.12 -r
和之前-R
相同。使用chmod,-R
由POSIX定义。
grep (GNU grep) 2.15
和我记得在以前的版本中看到过这一点。您确定不是这种情况吗?在大多数情况下,它们提供的结果基本相同,只是链接的行为不同。至于chmod
它,它很可能由POSIX定义,但这仍然可能是因为原始chmod
开发者选择R
了r
。
-r
因为那已经是一个有效的权限字符串。
通常,这取决于开发人员的个人喜好。但是,有时,如果对于开发人员认为比例如递归操作更重要的其他内容采用了首选的小写字母选项,则会选择一个大写字母选项。如果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
20年前,当我学习UNIX时,我的导师这样告诉我:“您最好总是在大写R中键入递归选项。因为某些命令在小写r选项上具有不同的含义,但是大写R通常用作递归选项到处都是,这会给您带来一个好习惯,因为您讨厌在键入R时按Shift键,对[rm * -Rf]保持谨慎。”