La diferencia entre -r y -R

32

A menudo sucede que quiero aplicar una operación de forma recursiva. Algunos comandos, como grep, usan una r minúscula para indicar la recursividad. Por ejemplo

grep -r foo .

Otros comandos parecen preferir una R mayúscula:

chmod -R 755 .

Constantemente los estoy entendiendo mal y olvidando cuál es cuál. ¿Hay alguna lógica detrás de la selección de casos para estos argumentos?

cjol
fuente
1
"Porque los programadores pensaron que era sensato". (sin decir que esta es una buena razón, pero probablemente sea la verdad)
HalosGhost
1
Por lo que vale, aunque no parece que muchos comandos entiendan --recursive, no es probable que hagan lo incorrecto.
Tanner Swett
44
en el caso de chmod, es porque -rsignifica desarmar el bit de lectura para todos los niveles
HorusKol

Respuestas:

37

La mayoría de los comandos de POSIX que tienen opción de directorio recorrido recursivo ( ls, chmod, chgrp, chmod, cp, rm) tienen -Rpor ello.

rmtambién tiene -rporque eso es lo que era inicialmente, mucho antes de POSIX.

Ahora, el comportamiento varía cuando se encuentran enlaces simbólicos al caminar por el árbol. POSIX trató de hacer las cosas consistentes agregando las opciones -L/ -H/ Ppara dar al usuario la oportunidad de decidir qué hacer con los enlaces simbólicos, dejando el valor predeterminado cuando ninguno se proporciona sin especificar.

POSIX grepno tiene -ro -R.

GNU grepinicialmente no tenía ninguno. -rfue agregado en 1998. Eso estaba siguiendo enlaces simbólicos.

-Rfue agregado como sinónimo en 2001 por coherencia con las otras utilidades. Eso seguía siguiendo los enlaces simbólicos.

En 2012 (grep 2.12), -rfue cambiado por lo que ya no sigue los enlaces simbólicos, posiblemente porque -L, -Hya se utiliza para otra cosa.

Los BSD grepse basaron en GNU grep durante mucho tiempo. Algunos de ellos han reescrito los suyos y han mantenido más o menos compatibilidad con GNU grep. Apple OS / X abordó el problema del enlace simbólico de manera diferente. -ry -Rson iguales y no siguen enlaces simbólicos. Sin -Sembargo, hay una opción que actúa como la opción chmod/ cp/ para seguir enlaces simbólicos.find-L

Stéphane Chazelas
fuente
13
TL; DR : Historia.
Sammitch
10
Historia temprana: rmtenía una opción recursiva antes que las demás. Fue -r. Luego cpganó una coincidencia -r. Entonces lsquería tener una opción recursiva, pero ls -rya significaba "clasificación inversa", así que tenía que serlo -R. Allí la tensión entre -Ry -rcomenzó. -Rera el único que podía agregarse constantemente a todas las utilidades relevantes, pero rm -rya era el uso tradicional bien conocido. Entonces apareció GNU y dijo "¡la consistencia y la tradición son para los cuadrados, hombre!"
8

Ninguno en absoluto. Simplemente depende de lo que elijan los desarrolladores. A menudo es porque ambas -ry -Rson opciones válidas. En los programas que citó, por ejemplo:

  • versiones recientes de 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.
    
  • chmodno tiene -ropción, por lo que, presumiblemente, los desarrolladores prefieren -R. Sin embargo, por supuesto, -res una cadena de permisos válida (como lo señaló @Arkadiusz Drabczykso), por lo que realmente no se puede usar allí.

terdon
fuente
Cual es tu grepversion GNU grep 2.12, -ry -Rson lo mismo. Con chmod, -Rse define por POSIX.
Cuonglm
@Gnouc grep (GNU grep) 2.15y recuerdo haber visto esto en versiones anteriores. ¿Estás seguro de que no es el caso en el tuyo? Proporcionan esencialmente los mismos resultados en la mayoría de los casos, solo se comportan de manera diferente con los enlaces. En cuanto a chmod, que bien puede ser definido por POSIX, pero que todavía es, presumiblemente, debido a que los originales chmoddesarrolladores optaron Rpor encima r.
terdon
2
@Gnouc D'oh! Obviamente, no pudieron usar -rya que esa es una cadena de permisos válida.
terdon
3

Principalmente, se reduce a una preferencia personal del desarrollador. A veces, sin embargo, se elige una opción en mayúscula si se toma una opción en minúscula preferida para otra cosa que los desarrolladores creen que es más importante que, por ejemplo, operar de forma recursiva. En caso de chmod -res un modo válido. Por ejemplo:

$ 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
Arkadiusz Drabczyk
fuente
1

Constantemente los estoy entendiendo mal y olvidando cuál es cuál.

Siempre que sea posible, use las versiones GNU de estas utilidades y luego puede usar los nombres más largos para las opciones.

command --recursive

¿Hay alguna lógica detrás de la selección de casos para estos argumentos?

No.

O no mucho. Las utilidades de Unix se desarrollaron poco a poco y las opciones de comando reflejan las elecciones individuales de sus desarrolladores principales o únicos. Solo hay 26 letras de opción en minúsculas ASCII disponibles, que es el conjunto preferido (los comandos generalmente están en minúsculas para facilitar la escritura), y este conjunto limitado conduce a conflictos mnemónicos. Los conflictos generan inconsistencias a medida que las nuevas versiones de comandos / utilidades adquieren nuevas características .

RedGrittyBrick
fuente
-1

Hace 20 años, cuando aprendí UNIX, mi mentor me dijo así: "Será mejor que escriba la opción recursiva en mayúscula R siempre. Debido a que algunos comandos tienen un significado diferente en la opción minúscula r, pero R mayúscula funciona principalmente como opción recursiva en todas partes. Y le dará la buena costumbre de ser cauteloso con [rm * -Rf] al presionar la tecla Mayús al presionar R. "

enzoy
fuente
2
Hubiera sido mejor si te hubiera dicho que leyeras el manual del comando en el sistema particular en el que estás, ya que las opciones no estándar pueden ser diferentes entre las implementaciones de herramientas.
Kusalananda