Qual é a diferença entre cp -R foo / e cp -R foo / *

2

Percebi que sempre que eu uso um comando cp -R foo/* eu copio tudo, exceto arquivos como .env ou provavelmente .gitignore

A solução é usar cp -R foo/ enquanto ele lida com o diretório inteiro, mas isso não muda o fato de eu ainda não entender o comportamento de usar um caractere * .

Por que um caractere * não captura arquivos como .env ?

O sistema operacional é o Debian

    
por Bartłomiej Sobieszek 17.08.2017 / 10:54

3 respostas

5
  • cp -R foo/ copia tudo recursivamente em foo/
  • cp -R foo/* copia recursivamente todos os arquivos e diretórios que correspondem a foo/* . E, por padrão, os nomes com um ponto não são incluídos ( ls * também não os listará). Isso é explicado aqui (bem como alguns outros pequenos detalhes sobre os principais pontos ).

Além da manipulação de arquivos com pontos iniciais, outra diferença é que cp -R foo/* copia os arquivos e diretórios individuais em foo/ para o diretório de destino, enquanto cp -R foo/ faz uma cópia de foo/ no diretório de destino ( então você tem mais um nível de diretório).

    
por 17.08.2017 / 13:58
3

Por padrão, globbing no bash não inclui nomes de arquivos que começam com . Então quando você especificar * , você está pedindo para copiar recursivamente sem arquivos começando com " . ". Quando você não especificar * , copia tudo, incluindo os arquivos " . ".

    
por 17.08.2017 / 11:14
2

Além das outras respostas, há alguns outros casos em que foo/ e foo/* podem ser diferentes (não apenas os arquivos que começam com . ). Além disso, se você quiser ter arquivos que iniciem com . correspondidos por seu glob, você poderá habilitar isso também com shopt -s dotglob .

O primeiro é se não houver entradas em foo/ e você não tiver ativado nullglob , então foo/* será retornado como um literal passado para cp . Como (neste caso) não há uma fonte foo/* cp reclamaria, enquanto cp -R foo/ sempre teria pelo menos foo/ para copiar. Se você ativou nullglob , então foo/* expandiria para nada, então você acabaria perdendo um argumento para cp .

Outro caso a ser considerado é se houver muitas entradas em foo/ . O shell expande o glob e invoca o processo, mas se o glob se expandir para muitos argumentos, você receberá um erro. Com cp -R foo/ você só tem 2 argumentos (embora presumivelmente você tenha um alvo em outro lugar).

    
por 18.08.2017 / 01:46