Un problema más me viene a la mente donde cat
vs. cp
hace una diferencia significativa:
Por definición, cat expandirá los archivos dispersos, llenando los huecos con bytes cero "reales", mientras que al menos cp se puede decir que conserve los agujeros.
Los archivos dispersos son archivos donde las secuencias de cero bytes han sido reemplazadas por metadatos para preservar el espacio. Puede probar creando uno con dd y duplicarlo con las herramientas que elija.
Cree un archivo disperso (cambie a / tmp de antemano para evitar problemas; consulte la 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
dimensionarlo: no debe ocupar espacio.
17> du -sh sparsetest
0 sparsetest
cópielo con cp y verifique el tamaño
18> cp sparsetest sparsecp
19> du -sh sparsecp
0 sparsecp
ahora cópialo con cat y comprueba el tamaño
20> cat sparsetest > sparsecat
21> du -sh sparsecat
1.3M sparsecat
pruebe sus herramientas preferidas para verificar su comportamiento
No te olvides de limpiar.
Nota final de precaución: los experimentos como estos tienen la posibilidad inherente de aumentar su fama con su administrador de sistemas local si los está haciendo en un sistema de archivos que es parte de su plan de respaldo, o crítico para el bienestar del sistema. Dependiendo de su elección de herramienta para la copia de seguridad, podría terminar necesitando más medios de cinta de los que alguna vez consideró posible hacer una copia de seguridad de ese archivo de 0 bytes que se expande a terabytes de ceros.
Otros archivos que no se pueden copiar con cat ni cp incluirían archivos especiales del dispositivo, etc. Depende de su implementación de la herramienta de copia si es capaz de duplicar el nodo del dispositivo, o si en su lugar copiaría felizmente su contenido.
cp
un archivo como el original, mientrascat
crea un nuevo archivo con el mismo contenido.cp
tiene una opción para controlar su comportamiento en archivos dispersos; like, con--sparse=never
especificado en la línea de comando,cp
es tan lento comocat
.Según el comentario de Keith ,
cp
conserva algunos permisos ycat
crea el nuevo archivo como seumask
indica. Por lo tanto$2
, no se conserva el permiso que$4/vmlinuz
está bastante limpio, mientras que si se activa algún permiso extraño$3
,$4/System.map
lo mantendrá.fuente
cat
la rapidez de los atributos?cat
rapido?Ambos tienen una funcionalidad equivalente en esos dos casos, pero cp es puramente una operación de archivo. "Toma este archivo y haz una copia allí".
cat, por otro lado, está destinado a volcar el contenido de un archivo a la consola. "Toma este archivo y muéstralo en la pantalla" y luego haz que un ninja ataque la pantalla y redirija la salida a otra parte.
cp generalmente sería más eficiente, ya que no hay redirección solo, simplemente una copia directa de bytes de la ubicación A a la ubicación B.
gato sería
read bytes -> output to console -> intercept output -> redirect to new file
.fuente
cat
realmente nooutput to console -> intercept output -> redirect to new file
, el archivo de salida para cat puede ser stdout o un archivo normal, solo saldrá al archivo, siempre que la entrada no sea la misma que la salida.cat
No tiene nada que ver con la consola. Tantocat
ycp
leer desde el archivo de entrada y escribir en el archivo de salida. Concat
, el archivo de salida es abierto por el shell, mientras que concp
, el archivo de salida es abierto porcp
; Esto no hace ninguna diferencia en el rendimiento.cp
puede ser más rápido, pero por una razón completamente diferente: algunas implementaciones decp
tratar de adivinar el tamaño de fragmento adecuado para el rendimiento dependiendo de los dispositivos de origen y destino; una implementación decat
no molestaría.Es realmente una cuestión de preferencia, en mi humilde opinión.
Técnicamente, no existe una diferencia real a menos que use el comando cp con el modificador -p para preservar la propiedad / grupo de archivos. De lo contrario, es lo mismo funcionalmente. La respuesta de Marc es mucho más clara y precisa.
fuente
cp
sin-p
conserva algunos permisos. Por ejemplo, si el archivo de origen es ejecutable,cp
hará que el archivo de destino sea ejecutable, perocat
no lo será.vmlinuz
no será ejecutable si$2
es así.