Cp recursivo copia o conteúdo da pasta em vez da pasta no OS X

6

No Terminal (usando bash e tcsh) cp -r copia o conteúdo de uma pasta em vez da pasta se o argumento da pasta tiver um / no final.

Dada a seguinte estrutura:

folderA
  |-fileA
  |-fileB

O comando a seguir copia o arquivo A e o arquivo B para o destino, em vez de copiar o folderA para o destino:

cp -r folderA/ destination

Então, ele age como

cp -r folderA/* destination

Isso é super chato, porque a conclusão padrão no tcsh adiciona um / no final da pasta, então eu sempre acabo tendo que limpar se eu esquecer de apagar o / no final. Esse comportamento é diferente de todos os outros * nix em que trabalhei.

Existe alguma maneira de mudar isso e fazer cp -r folderA / copiar a pasta em vez de seu conteúdo?

    
por lajos 23.05.2009 / 07:01

3 respostas

7

Há um caso a ser feito de que esse comportamento faz mais sentido (e acredito que seja usado pelo rsync, mesmo no GNU / Linux). Considere o seguinte caso:

 mydir
   |-.fileA
   |-fileB

A semântica desses três especificadores é toda diferente:

 cp -r mydir   dest/   # creates dest/mydir, containing both files
 cp -r mydir/  dest/   # copies both files directly into dest
 cp -r mydir/* dest/   # copies fileB, but not .fileA, directly into dest

Eu acredito que este é um exemplo de diferença entre o BSD e o GNU. Você pode instalar ferramentas com sabor GNU usando o fink (veja pacote coreutils ), mas estes podem não preservar todos os metadados do HFS +, portanto, continue com cautela.

Você pode interceptar o comando e remover a barra final. Vou deixar isso como um exercício para o leitor ou outros respondentes.

Você pode alterar o comportamento de conclusão de tabulação para que a barra não seja adicionada em primeiro lugar. Adicione o seguinte ao seu ~/.tcshrc :

 unset addsuffix

Você pode obter um efeito semelhante nos utilitários bash e misc readline adicionando o seguinte ao seu ~/.inputrc :

 set mark-directories off
    
por 23.05.2009 / 08:26
2

Sem excluir manualmente o '/' anexado em uma instalação padrão? Infelizmente, tal como indicado na página de manual da Darwin da Apple, o cp é "If o source_file termina em um /, o conteúdo do diretório é copiado em vez do próprio diretório. " Então parece que é parte do design de cp de Darwin.

No entanto, é possível cancelar a configuração da variável addsuffix shell em tcsh para eliminar o '/' de ser adicionado aos diretórios. A grande desvantagem é que agora é muito difícil dizer se você está lidando com um diretório ou um arquivo apenas a partir da conclusão. Para fazer isso, digite na sua linha de comando (ou adicione ao seu .tcshrc):

 unset addsuffix

Para bash , você pode usar a configuração mark-directories . Você pode digitar o seguinte ou adicioná-lo ao seu .bashrc:

 bind 'set mark-directories off'

Fonte para uso de diretórios de marcas: Fóruns MacNN : Hal Itosis

    
por 23.05.2009 / 07:54
1

"Você pode interceptar o comando e remover a barra. Vou deixar isso como um exercício para o leitor ou outros respondentes." Adicionando

function cp() { /bin/cp $(echo "$*" | sed 's|/ | |g'); }

para ~ / .bashrc parece fazer o truque.

    
por 10.10.2016 / 22:25