¿Hay alguna diferencia entre estos dos comandos?

¿Hay alguna diferencia entre estos dos comandos?
cat a > b

y

cp a b

Si son funcionalmente iguales para todos los efectos, ¿cuál es más rápido?

Respuesta1

En cuanto a funcionalidad creo que son iguales.

Si tuviera que adivinar cuál es más rápido, diría que elCPcomando porque su propósito es realizar operaciones de archivos solo con fines de copia, por lo que estaría optimizado para eso.

gato, por el contrario, se refiereconcatenararchivos, es decir, unir varios archivos en una serie. Si no se especifica ningún archivo, mostrará un archivo en la consola (gracias a @bahamat por recordárnoslo). En este ejemplo, la salida se redirige a otro archivo. Creo que esta dirección indirecta sería menos eficiente que una directa cp.

No sé si la diferencia se notaría en archivos de tamaño normal, aunque sería interesante cronometrarlos en archivos muy grandes. Supongo que se podrían hacer pruebas repetidas con /usr/bin/time y ver si uno es consistentemente más rápido/lento que el otro.

¿Tiene alguna razón particular para preguntar sobre esto, o es simplemente curiosidad (no hay nada de malo en eso, por supuesto)?

Respuesta2

Funcionalmente similar, pero específicamente diferente. Básicamente, ambos leen un montón de datos del primer archivo y los escriben en otro archivo.

cuando hago unrastroen 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)                           = ?

Respuesta3

No hay mucha diferencia: ambos copian el contenido del archivo antiguo en un archivo nuevo con el mismo contenido. Ambos sobrescriben el destino si es un archivo existente.

Algunos sistemas antiguos pueden dejar de copiar o truncar líneas si intenta copiar archivos binarios con cat, porque podrían ahogarse con caracteres nulos. No creo que ningún sistema Unix que puedas encontrar ahora tenga un problema allí. cpSe garantiza que no tendrá ningún problema.

cple permite especificar un directorio como destino: el archivo se copia para que tenga el mismo nombre que el original, en el nuevo directorio.

Si el destino no existe, cputiliza los bits de permiso del archivo fuente, modificados por el actualmáscara.

Puede protegerse contra la sobrescritura del archivo de destino al cat … >targetconfigurar la noclobberopción en el shell conset -C. Puede protegerse contra la sobrescritura del archivo de destino cppasando la -iopción ( alias cp='cp -i'); cppedirá confirmación.

A menudo resulta útil conservar la fecha del archivo original. Puedes usar cp -ppara eso.

El rendimiento variará según el tamaño del archivo, el sistema de archivos, el tipo de disco de origen y de destino, el sistema operativo, etc.Para copias de discos sin formato en Linux, No encontré casi ninguna diferencia.

Respuesta4

Parece que el gato es fastermás que 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

información relacionada