Existe diferença entre esses dois comandos?

6
cat a > b

e

cp a b

Se eles são funcionalmente iguais para todos os efeitos, qual deles é mais rápido?

    
por Steven Lu 30.06.2012 / 04:28

4 respostas

6

Em termos de funcionalidade, acho que são iguais.

Se eu tivesse que arriscar um palpite sobre o que é mais rápido, eu diria que o cp comando porque seu propósito é fazer operações de arquivo apenas para propósitos de cópia, então seria otimizado para isso.

cat , em contraste, significa concatenar arquivos, significando juntar vários arquivos em uma série. Se nenhum arquivo for especificado, ele exibirá um arquivo no console (graças ao @bahamat para nos lembrar). Neste exemplo, a saída é redirecionada para outro arquivo. Acho que esse indireito seria menos eficiente que um cp direto.

Eu não sei se a diferença seria perceptível para arquivos de tamanho normal, embora seria interessante cronometrá-los em arquivos muito grandes. Eu acho que alguém poderia fazer testes repetidos com / usr / bin / time e ver se um é consistentemente mais rápido / lento que o outro.

Você tem alguma razão em particular para perguntar sobre isso, ou é apenas uma simples curiosidade (nada de errado com isso, é claro)

    
por 30.06.2012 / 04:34
4

Funcionalmente semelhante, mas especificamente diferente. Essencialmente, ambos lêem um monte de dados do primeiro arquivo, escrevem em outro arquivo.

Quando faço um strace no Linux:

$ strace cat /etc/fstab > test.txt
...
open("/etc/fstab", O_RDONLY|O_LARGEFILE) = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=691, ...}) = 0
fadvise64_64(3, 0, 0, POSIX_FADV_SEQUENTIAL) = 0
read(3, "# /etc/fstab: static file system"..., 32768) = 691
write(1, "# /etc/fstab: static file system"..., 691) = 691
read(3, "", 32768)                      = 0
close(3)                                = 0
close(1)                                = 0
close(2)                                = 0
exit_group(0)                           = ?

$ strace cp /etc/fstab test.log
...
open("/etc/fstab", O_RDONLY|O_LARGEFILE) = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=691, ...}) = 0
open("test.log", O_WRONLY|O_CREAT|O_EXCL|O_LARGEFILE, 0644) = 4
fstat64(4, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
read(3, "# /etc/fstab: static file system"..., 32768) = 691
write(4, "# /etc/fstab: static file system"..., 691) = 691
read(3, "", 32768)                      = 0
close(4)                                = 0
close(3)                                = 0
_llseek(0, 0, 0xbfaa3fb0, SEEK_CUR)     = -1 ESPIPE (Illegal seek)
close(0)                                = 0
close(1)                                = 0
close(2)                                = 0
exit_group(0)                           = ?
    
por 30.06.2012 / 10:54
3

Não há muita diferença: copie o conteúdo do arquivo antigo em um novo arquivo com o mesmo conteúdo. Ambos sobrescrevem o alvo se for um arquivo existente.

Alguns sistemas antigos podem parar de copiar ou truncar linhas se você tentar copiar arquivos binários com cat , porque eles podem se engasgar com caracteres nulos. Eu não acho que qualquer sistema unix que você possa encontrar agora tenha um problema lá. cp tem garantia de não ter um problema.

cp permite que você especifique um diretório como o destino: o arquivo é copiado para ter o mesmo nome que o original, no novo diretório.

Se o destino não existir, cp usará os bits de permissão do arquivo de origem, modificados pela umask a>.

Você pode proteger contra sobrescrever o arquivo de destino ao fazer cat … >target , definindo a opção noclobber no shell com set -C . Você pode proteger contra sobrescrever o arquivo de destino com cp passando a opção -i ( alias cp='cp -i' ); cp pedirá confirmação.

Geralmente, é útil preservar a data do arquivo original. Você pode usar cp -p para isso.

O desempenho varia, dependendo do tamanho do arquivo, do sistema de arquivos, do tipo de disco de origem e de destino, do sistema operacional etc. Para cópias de discos brutos no Linux , eu encontrei o próximo sem diferença.

    
por 30.06.2012 / 16:25
0

Parece que o gato é faster than cp

root@SHW:/tmp# time cp debug.log test1
real    0m0.021s
user    0m0.000s
sys 0m0.000s
root@SHW:/tmp# time cat debug.log > test2
real    0m0.013s
user    0m0.000s
sys 0m0.000s
root@SHW:/tmp# du -h debug.log 
4.0K    debug.log
root@SHW:/tmp# file debug.log
debug.log: ASCII text
    
por 30.06.2012 / 13:01