Quando alguém não quer que o 'cp' seja recursivo?

5

Em que condições alguém pode querer usar o comando cp em um diretório e ainda assim que ele não seja recursivo? Considere:

$ tree
.
└── old
    └── inner
        └── a.txt

2 directories, 1 file

$ cp old/inner/ .
cp: omitting directory 'old/inner/'

$ tree
.
└── old
    └── inner
        └── a.txt

2 directories, 1 file

O que isso fez? Então, por que alguém nunca usaria o flag -r e, portanto, por que não está implícito sem especificá-lo? Observe que o sinalizador -r não afeta os arquivos comuns:

$ cp -r old/inner/a.txt .
$ ls
a.txt  old

Eu percebo que eu poderia alias de cp a cp -r , mas meu objetivo é entender qual é o motivo, não corrigir nada.

    
por dotancohen 10.07.2013 / 14:18

2 respostas

5

Muitas vezes, quero copiar apenas os arquivos de um diretório, por que isso parece estranho? Depende do que você está tentando fazer. Por exemplo, às vezes tenho todos os arquivos que estou usando para um projeto em um diretório, digamos que esses arquivos sejam necessários para a execução do meu programa. Eu também posso ter vários sub-diretórios com compilações antigas ou arquivos de dados ou qualquer outra coisa. Se eu quiser transferir isso para um servidor para executar meu programa, só quero que os arquivos não sejam os subdiretórios, então o padrão cp é exatamente o que eu preciso.

Além do simples fato de que às vezes você não quer copiar recursivamente, em geral a recursão precisa ser ativada explicitamente para praticamente todos os programas. Este é o padrão e é isso que um usuário esperaria na primeira vez que alguém utilizasse o programa. Portanto, fazer a recursão do padrão não seria uma boa ideia. A necessidade de adicionar um sinal -r para recursão é o comportamento esperado, em geral você não deseja recursão por padrão (pense em chmod ou grep ou ls etc).

    
por 10.07.2013 / 15:37
3

Diretórios de enfrentamento recursivo têm o potencial de substituir um grande número de arquivos. Se você fizesse isso sem querer, poderia causar muito dano com um único comando. O padrão não-recursivo garante que, toda vez que você copiar um diretório para outro, esteja explicitamente fazendo isso e, teoricamente, tenha pensado sobre o que digitou antes de executá-lo.

Este não é o melhor exemplo, mas imagine o que aconteceria se você acidentalmente digitasse o seguinte comando sem perceber que ambos os destinos eram diretórios:

cp /bin /usr # /usr/bin already exists and has important stuff in it

EDIT1: Uma solução poderia ser interativamente solicitar ao usuário e perguntar "Tem certeza?" em vez de adicionar um sinalizador explícito. Isso, no entanto, não se encaixa muito bem na filosofia do UNIX: "Não insista em informações interativas" [McIlroy78]. cp é um antigo programa UNIX que obviamente mudou alguns ao longo do tempo, mas essa linhagem ainda pode ser vista em muitos aspectos de seu design.

EDIT2: Encontrei várias outras boas razões para isso (provavelmente há também mais). Um pode ser encontrado no StackExchange.

  1. As opções de linha de comando e o comportamento fundamental de programas tão antigos e comuns quanto cp podem ser difíceis de alterar devido à sua utilização em scripts de shell. Alguns scripts podem depender desse comportamento (recusando-se a copiar diretórios). Um prompt interativo também não é algo que você deseja em muitos shell scripts.

  2. Copiando arquivos e diretórios de enfrentamento são duas ações fundamentalmente diferentes que exigem comandos ou opções conceitualmente separadas para manipulá-los:

[McIlroy78] O Jornal Técnico do Sistema Bell. Laboratórios Bell. M. D. McIlroy , E. N. Pinson e B. A. Tague. “Sistema de compartilhamento de tempo Unix Forward”. 1978. 57 (6, parte 2). p. 1902.

    
por 10.07.2013 / 14:23

Tags