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

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

grep -r foo . 

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

 chmod -R 755 . 

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

  • Разделение двух каталогов рекурсивно на основе контрольных сумм?
  • рекурсивный 'ls', дающий абсолютные имена файлов
  • Поиск и замена полной строки в рекурсивных файлах
  • Как найти каталог файлов?
  • Шаблоны с тремя точками
  • Рекурсивно найти и переместить поврежденные PDF-файлы
  • Рекурсивная функция не работает
  • wget - Как загрузить рекурсивно и только определенные типы / расширения mime (т. е. только текст)
  • 4 Solutions collect form web for “Разница между -r и -R”

    Большинство команд POSIX, которые имеют рекурсивный путь обхода каталога ( ls , chmod , chgrp , chmod , cp , rm ), имеют для этого -R .

    rm также имеет -r потому что это то, что было изначально.

    Теперь поведение меняется, когда символические ссылки обнаруживаются при движении по дереву. POSIX попытался сделать что-то согласованным, добавив опции -L / -H / P , чтобы дать пользователю возможность решить, что делать с символическими ссылками, оставляющими умолчание, когда ни один не указан неуказанным.

    POSIX grep не имеет -r или -R .

    GNU grep изначально не было ни того, ни другого. -r был добавлен в 1998 году. Это были следующие символические ссылки.

    -R был добавлен в качестве синонима в 2001 году для согласованности с другими утилитами. Это продолжалось после символических ссылок.

    В 2012 году (grep 2.12), -r был изменен, чтобы больше не следовать символическим ссылкам, возможно потому, что -L , -H уже использовались для чего-то другого.

    BSDs 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), ее там действительно нельзя использовать.

    В основном, это сводится к личному предпочтению разработчика. Иногда, однако, выбирается опция верхнего регистра, если предпочтительная строчная опция используется для чего-то еще, что, по мнению разработчиков, важнее, чем, например, рекурсивно работать. В случае 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 

    Я постоянно делаю это неправильно и забываю, что есть.

    По возможности используйте GNU-версии этих утилит, а затем вы можете использовать более длинные имена для параметров.

     command --recursive 

    Существует ли какая-либо логика выбора аргумента для этих аргументов?

    Нет.

    Или не очень. Утилиты Unix были разработаны по частям, а параметры команды отражают индивидуальный выбор их ведущих или отдельных разработчиков. Доступно только 26 буквенных букв ASCII, что является предпочтительным набором (команды, как правило, в нижнем регистре для удобства ввода), и этот ограниченный набор приводит к мнемоническим конфликтам. Конфликты приводят к несогласованности, поскольку новые версии команд / утилит получили новые возможности .

    Linux и Unix - лучшая ОС в мире.