A diferença entre -r e -R

32

Muitas vezes acontece que eu quero aplicar uma operação recursivamente. Alguns comandos, como grep, usam r minúsculo para indicar recursão. Por exemplo

grep -r foo .

Outros comandos parecem preferir um R maiúsculo:

chmod -R 755 .

Estou constantemente entendendo isso errado e esquecendo qual é qual. Existe alguma lógica por trás da seleção de argumentos para esses argumentos?

cjol
fonte
1
"Porque os codificadores pensaram que era sensato." (não dizendo que esta é uma boa razão, mas é provavelmente a verdade)
HalosGhost
1
Pelo que vale a pena, embora poucos comandos pareçam entender --recursive, é provável que eles não façam a coisa errada.
9608 Tanner Swett #
4
no caso de chmod, é porque -ros meios para remover o bit de leitura para todos os níveis
HorusKol

Respostas:

37

A maioria dos comandos POSIX que têm opção de passagem de diretório recursiva ( ls, chmod, chgrp, chmod, cp, rm) tem -Rpara isso.

rmtambém tem, -rporque era o que era inicialmente, muito antes do POSIX.

Agora, o comportamento varia quando são encontrados links simbólicos ao andar pela árvore. O POSIX tentou tornar as coisas consistentes adicionando as opções -L/ -H/ Ppara dar ao usuário a chance de decidir o que fazer com os links simbólicos, deixando o padrão quando nenhum é fornecido não especificado.

O POSIX grepnão possui -rou -R.

O GNU grepinicialmente não tinha nenhum. -rfoi adicionado em 1998. Isso seguia os links simbólicos.

-Rfoi adicionado como sinônimo em 2001 por consistência com os outros utilitários. Isso ainda estava seguindo links simbólicos.

Em 2012 (grep 2,12), -rfoi alterado para que ele não seguiu links simbólicos, possivelmente porque -L, -Hjá foram utilizados para outra coisa.

Os BSDs grepforam baseados no GNU grep por um longo tempo. Alguns deles reescreveram seus próprios e mantiveram mais ou menos compatibilidade com o GNU grep. O Apple OS / X abordou o problema do link simbólico de maneira diferente. -re -Rsão iguais e não seguem links simbólicos. No -Sentanto, existe uma opção que funciona como a opção chmod/ cp/ para seguir links simbólicos.find-L

Stéphane Chazelas
fonte
13
TL; DR : História.
Sammitch 10/09/14
10
História antiga: rmtinha uma opção recursiva diante dos demais. Foi -r. Então cpganhou uma correspondência -r. Em seguida, lsqueria ter uma opção recursiva, mas ls -rjá significava "classificação inversa", por isso tinha que ser -R. Lá a tensão entre -Re -rcomeçou. -Rera o único que podia ser adicionado consistentemente a todos os utilitários relevantes, mas rm -rjá era o uso tradicional bem conhecido. Então o GNU apareceu e disse: "consistência e tradição são para quadrados, cara!"
8

Nenhuma. Depende simplesmente do que os desenvolvedores escolheram. Geralmente é porque ambos -re -Rsão opções válidas. Nos programas que você citou, por exemplo:

  • versões recentes do 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.
    
  • chmodnão tem -ropção, presumivelmente, os desenvolvedores preferem -R. No entanto, -ré claro, é uma sequência de permissões válida (como apontado por @Arkadiusz Drabczykso), portanto, não pode realmente ser usada lá.

terdon
fonte
Qual é a sua grepversão? GNU grep 2.12 -re -Rsão os mesmos. Com chmod, -Ré definido pelo POSIX.
precisa saber é o seguinte
@Gnouc grep (GNU grep) 2.15e lembro de ter visto isso nas versões anteriores. Tem certeza de que não é o seu caso? Eles fornecem essencialmente os mesmos resultados na maioria dos casos, eles só se comportam de maneira diferente com links. Quanto chmod, pode muito bem ser definido pela POSIX, mas que ainda é, provavelmente, porque os originais chmoddevs escolheu Rmais r.
terdon
2
@Gnouc D'oh! Obviamente, eles não poderiam usar, -rpois essa já é uma sequência de permissões válida.
terdon
3

Principalmente, tudo se resume a uma preferência pessoal do desenvolvedor. Às vezes, no entanto, uma opção em maiúscula é escolhida se uma opção preferida em minúscula for usada para outra coisa que os desenvolvedores acreditam ser mais importante do que, por exemplo, operar recursivamente. No caso de chmod, -ré um modo válido. Por exemplo:

$ 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
fonte
1

Estou constantemente entendendo isso errado e esquecendo qual é qual.

Sempre que possível, use as versões GNU desses utilitários e, em seguida, use os nomes mais longos para as opções.

command --recursive

Existe alguma lógica por trás da seleção de argumentos para esses argumentos?

Não.

Ou não muito. Os utilitários Unix foram desenvolvidos aos poucos e as opções de comando refletem as escolhas individuais de seus principais ou únicos desenvolvedores. Existem apenas 26 letras de opção em minúsculas ASCII disponíveis, que é o conjunto preferido (os comandos geralmente estão em minúsculas para facilitar a digitação), e esse conjunto limitado leva a conflitos mnemônicos. Os conflitos levam à inconsistência, à medida que novas versões de comandos / utilitários ganham novos recursos .

RedGrittyBrick
fonte
-1

Há 20 anos, quando eu aprendi o UNIX, meu mentor me disse assim: "É melhor você sempre digitar a opção recursiva em R maiúsculo. Como alguns comandos têm um significado diferente na opção r em minúscula, mas o R em maiúscula funciona principalmente como opção recursiva E você terá um bom hábito de ser cauteloso ao pressionar [rm * -Rf] ao pressionar a tecla Shift ao digitar R. "

enzoy
fonte
2
Teria sido melhor se ele lhe dissesse para ler o manual do comando no sistema específico em que você está, pois as opções não padrão podem muito bem ser diferentes entre implementações de ferramentas.
Kusalananda