Mais uma questão vem à minha mente onde cat
vs. cp
faz 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.
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
dimensione - não deve ocupar espaço.
17> du -sh sparsetest
0 sparsetest
copie-o com cp e verifique o tamanho
18> cp sparsetest sparsecp
19> du -sh sparsecp
0 sparsecp
agora copie-o com gato e verifique o tamanho
20> cat sparsetest > sparsecat
21> du -sh sparsecat
1.3M sparsecat
tente suas ferramentas preferidas para verificar o comportamento delas
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.
cp
,cat
cria um arquivo como o original, enquanto cria um novo arquivo com o mesmo conteúdo.cp
tem uma opção para controlar seu comportamento em arquivos esparsos; como, com--sparse=never
especificado na linha de comando,cp
é tão lento quantocat
.De acordo com o comentário de Keith ,
cp
preserva algumas permissões ecat
cria o novo arquivo conformeumask
indicado. A$2
permissão de So não é preservada, o que$4/vmlinuz
é bastante limpo, enquanto se alguma permissão estranha estiver ativada$3
,$4/System.map
a manterá.fonte
cat
a jovialidade?cat
mais rápido?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
cat
Na verdadeoutput 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.cat
não tem nada a ver com o console. Amboscat
ecp
ler a partir do arquivo de entrada e gravação para o arquivo de saída. Comcat
, o arquivo de saída é aberto pelo shell, enquanto que comcp
, o arquivo de saída é aberto porcp
; isso não faz diferença no desempenho.cp
pode ser mais rápido, mas por um motivo completamente diferente: algumas implementaçõescp
tentam adivinhar o tamanho correto do pedaço para o desempenho, dependendo da origem e dos dispositivos de destino; uma implementação decat
não incomodaria.É 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.
fonte
cp
sem-p
preserva algumas permissões. Por exemplo, se o arquivo de origem for executável,cp
o arquivo de destinocat
será executável, mas não será.vmlinuz
, não será executável, seja$2
.