cp vs cat para copiar um arquivo

11

cp a b e cat a > b , qual é a diferença?

No script de instalação do x86 da árvore de código-fonte do kernel do linux ( arch/x86/boot/install.sh ), ambos são usados:

cat $2 > $4/vmlinuz
cp $3 $4/System.map

Por que eles não mantêm o mesmo formato se um é melhor que o outro?

    
por TheoYou 29.01.2012 / 03:18

4 respostas

12

Mais uma questão vem à minha mente, onde cat vs. cp faz uma diferença significativa:

Por definição, cat expandirá arquivos esparsos, preenchendo as lacunas com bytes zero "reais", enquanto pelo menos o cp pode ser informado para preservar os buracos.

Arquivos esparsos são arquivos em que as sequências de zero bytes foram substituídas por metadados para preservar o espaço. Você pode testar criando um com dd e duplicá-lo com as ferramentas de sua escolha.

  1. Crie um arquivo esparso (mudando para / tmp antecipadamente para evitar problemas - veja nota final):

    15> cd /tmp
    16> dd if=/dev/null of=sparsetest bs=512b seek=5 
    0+0 records in 
    0+0 records out 
    0 bytes (0 B) copied, 5.9256e-05 s, 0.0 kB/s
    
  2. dimensione - não deve ocupar nenhum espaço.

    17> du -sh sparsetest
    0       sparsetest
    
  3. copie-o com cp e verifique o tamanho

    18> cp sparsetest sparsecp
    19> du -sh sparsecp
    0       sparsecp
    
  4. agora copie-o com o gato e verifique o tamanho

    20> cat sparsetest > sparsecat
    21> du -sh sparsecat
    1.3M    sparsecat
    
  5. experimente suas ferramentas preferidas para verificar o comportamento delas

  6. não se esqueça de limpar.

Nota final de cautela: Experimentos como esses têm a chance inerente de aumentar sua fama com seu administrador de sistema local, se você os estiver fazendo em um sistema de arquivos que faz parte de seu plano de backup, ou crítico para o bem-estar do sistema. Dependendo de sua escolha de ferramenta para backup, ele pode acabar precisando de mais mídias de fita do que jamais considerou possível fazer backup de um arquivo de 0 byte que é expandido para terabytes de zeros.

Outros arquivos que não podem ser copiados nem com cat nem com cp incluem arquivos especiais de dispositivos, etc. Depende da sua implementação da ferramenta de cópia, se for capaz de duplicar o nó do dispositivo, ou se, em vez disso, copia o seu conteúdo de forma alegre.

    
por 30.01.2012 / 16:03
6

De acordo com o comentário de Keith , cp preserva algumas permissões e cat cria o novo arquivo como umask indica. Portanto, a permissão $2 não é preservada, pois $4/vmlinuz é bastante limpo, enquanto se alguma permissão estranha for definida em $3 , $4/System.map manterá isso.

    
por 13.04.2017 / 14:36
4

Ambos possuem funcionalidade equivalente nesses dois casos, mas cp é puramente uma operação de arquivo. "Pegue este arquivo e faça uma cópia dele ali".

cat, por outro lado, destina-se a despejar o conteúdo de um arquivo para o console. "Pegue este arquivo e exiba-o na tela" e faça um ninja atacar a tela e redirecionar a saída para outro lugar.

cp geralmente seria mais eficiente, já que não há redirecionamento apenas, apenas uma cópia direta de bytes do local A para o local B.

cat seria read bytes -> output to console -> intercept output -> redirect to new file .

    
por 29.01.2012 / 03:25
2

É realmente uma questão de preferência, IMHO.

Não há, tecnicamente, nenhuma diferença real, a menos que você use o comando cp com a opção -p para preservar a propriedade / grupo de arquivos. Caso contrário, é a mesma coisa funcionalmente. A resposta de Marc é muito mais clara e precisa.

    
por 29.01.2012 / 03:26