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í. cp
Se garantiza que no tendrá ningún problema.
cp
le 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, cp
utiliza los bits de permiso del archivo fuente, modificados por el actualmáscara.
Puede protegerse contra la sobrescritura del archivo de destino al cat … >target
configurar la noclobber
opción en el shell conset -C
. Puede protegerse contra la sobrescritura del archivo de destino cp
pasando la -i
opción ( alias cp='cp -i'
); cp
pedirá confirmación.
A menudo resulta útil conservar la fecha del archivo original. Puedes usar cp -p
para 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 faster
má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