Разница между -r и -R

32

Часто бывает, что я хочу применить операцию рекурсивно. Некоторые команды, такие как grep, используют строчную букву r для обозначения рекурсии. Например

grep -r foo .

Другие команды предпочитают заглавные буквы R:

chmod -R 755 .

Я постоянно ошибаюсь и забываю, что есть что. Есть ли какая-то логика в выборе случая для этих аргументов?

cjol
источник
1
«Потому что кодеры думали, что это разумно». (не сказать, что это веская причина, но, вероятно, это правда)
HalosGhost
1
Для чего это стоит, хотя не многие команды, кажется, понимают --recursive, они вряд ли сделают неправильно.
Таннер Светт
4
в случае chmod это потому, что -rозначает
сбросить

Ответы:

37

Большинство команд 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«s -Lварианта следовать по символическим ссылкам.

Стефан Шазелас
источник
13
TL; DR : История.
Sammitch
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. Тем не менее, конечно, -rэто допустимая строка прав доступа (как указано @Arkadiusz Drabczykso), поэтому ее нельзя использовать там.

Тердон
источник
Какая у вас grepверсия? GNU grep 2.12 -rи -Rтоже самое. С chmod -Rопределяется POSIX.
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 были разработаны по частям, а параметры команд отражают индивидуальный выбор их ведущего или единственного разработчика. Доступно только 26 букв ASCII строчных букв, что является предпочтительным набором (команды обычно пишутся в нижнем регистре для простоты ввода), и этот ограниченный набор приводит к мнемоническим конфликтам. Конфликты приводят к несогласованности, поскольку новые версии команд / утилит получают новые функции .

RedGrittyBrick
источник
-1

20 лет назад, когда я изучал UNIX, мой наставник сказал мне так: «Вам лучше всегда набирать рекурсивную опцию в верхнем регистре R, потому что некоторые команды имеют другое значение в нижнем регистре r, но верхний регистр R в основном работает как рекурсивный вариант. везде. И это даст вам хорошую привычку быть осторожным с [rm * -Rf], раздражая нажатие клавиши Shift при вводе R. "

enzoy
источник
2
Было бы лучше, если бы он сказал вам прочитать руководство по команде для конкретной системы, в которой вы работаете, поскольку нестандартные параметры могут отличаться в разных реализациях инструментов.
Кусалананда