Respuestas:
Un problema más me viene a la mente donde catvs. cphace 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/sdimensionarlo: no debe ocupar espacio.
17> du -sh sparsetest
0 sparsetestcópielo con cp y verifique el tamaño
18> cp sparsetest sparsecp
19> du -sh sparsecp
0 sparsecpahora cópialo con cat y comprueba el tamaño
20> cat sparsetest > sparsecat
21> du -sh sparsecat
1.3M sparsecatpruebe 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.
cptiene una opción para controlar su comportamiento en archivos dispersos; like, con --sparse=neverespecificado en la línea de comando, cpes tan lento como cat.
Según el comentario de Keith , cpconserva algunos permisos y catcrea el nuevo archivo como se umaskindica. Por lo tanto $2, no se conserva el permiso que $4/vmlinuzestá bastante limpio, mientras que si se activa algún permiso extraño $3, $4/System.maplo mantendrá.
catla rapidez de los atributos?
catrapido?
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.
catrealmente no output 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.
catNo tiene nada que ver con la consola. Tanto caty cpleer desde el archivo de entrada y escribir en el archivo de salida. Con cat, el archivo de salida es abierto por el shell, mientras que con cp, el archivo de salida es abierto por cp; Esto no hace ninguna diferencia en el rendimiento. cppuede ser más rápido, pero por una razón completamente diferente: algunas implementaciones de cptratar de adivinar el tamaño de fragmento adecuado para el rendimiento dependiendo de los dispositivos de origen y destino; una implementación de catno 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.
cpsin -pconserva algunos permisos. Por ejemplo, si el archivo de origen es ejecutable, cphará que el archivo de destino sea ejecutable, pero catno lo será.
cpun archivo como el original, mientrascatcrea un nuevo archivo con el mismo contenido.