cp vs. cat para copiar um arquivo

12

cp a be cat a > bqual a diferença?

No script de instalação x86 da árvore de fontes ( arch/x86/boot/install.sh) do kernel do linux , 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?

Qian
fonte

Respostas:

14

Mais uma questão vem à minha mente onde catvs. cpfaz uma diferença significativa:

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

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

  1. Crie um arquivo esparso (alterando para / tmp antecipadamente para evitar problemas - veja a 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 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 gato e verifique o tamanho

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

  6. não esqueça de limpar.

Nota final de cautela: Experiências como essas têm a chance inerente de aumentar sua fama com o administrador de sistemas local, se você as estiver executando em um sistema de arquivos que faça parte do plano de backup dele ou seja crítico para o bem-estar do sistema. Dependendo da sua escolha de ferramenta para backup, ele pode acabar precisando de mais mídia de fita do que jamais considerou possível fazer backup desse arquivo de 0 byte que é expandido para terabytes de zeros.

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

Tatjana Heuser
fonte
1
Assim cp, catcria um arquivo como o original, enquanto cria um novo arquivo com o mesmo conteúdo.
Qian
Ambas as ferramentas operam no conteúdo, mas o cp (pelo menos implementações "modernas") está ciente de algumas especialidades hoje em dia, como buracos (as implementações antigas do gato serão executadas nessa armadilha). Também existem sistemas de arquivos que desconhecem o conceito de arquivos esparsos, por exemplo, HFS + (MacOS) ou FAT (MSDOS, USB-Sticks, etc.), fazendo com que sejam ampliados para o tamanho máximo. Portanto, existem constelações em que cp ou cat não farão diferença na prática.
Tatjana Heuser
Aliás, o GNU cptem uma opção para controlar seu comportamento em arquivos esparsos; como, com --sparse=neverespecificado na linha de comando, cpé tão lento quanto cat.
oguz ismail
6

De acordo com o comentário de Keith , cppreserva algumas permissões e catcria o novo arquivo conforme umaskindicado. A $2permissão de So não é preservada, o que $4/vmlinuzé bastante limpo, enquanto se alguma permissão estranha estiver ativada $3, $4/System.mapa manterá.

TheoYou
fonte
esse é o motivo para atribuir cata jovialidade?
precisa saber é o seguinte
2
É catmais rápido?
Qian
4

Ambos têm funcionalidade equivalente nesses dois casos, mas o cp é puramente uma operação de arquivo. "Pegue este arquivo e faça uma cópia dele por lá".

cat, por outro lado, pretende despejar o conteúdo de um arquivo no console. "Pegue este arquivo e exiba-o na tela" e faça com que um ninja ataque a tela e redirecione a saída para outro lugar.

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

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


fonte
3
catNa verdade output to console -> intercept output -> redirect to new file, o arquivo de saída para cat pode ser stdout ou um arquivo normal; ele será enviado apenas para o arquivo, desde que a entrada não seja a mesma que a saída.
4
catnão tem nada a ver com o console. Ambos cate cpler a partir do arquivo de entrada e gravação para o arquivo de saída. Com cat, o arquivo de saída é aberto pelo shell, enquanto que com cp, o arquivo de saída é aberto por cp; isso não faz diferença no desempenho. cppode ser mais rápido, mas por um motivo completamente diferente: algumas implementações cptentam adivinhar o tamanho correto do pedaço para o desempenho, dependendo da origem e dos dispositivos de destino; uma implementação de catnão incomodaria.
Gilles 'SO- stop be evil'
2

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

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

Skittles
fonte
3
cpsem -ppreserva algumas permissões. Por exemplo, se o arquivo de origem for executável, cpo arquivo de destino catserá executável, mas não será.
Keith Thompson
Bom ponto! Portanto vmlinuz, não será executável, seja $2.