cp vs. cat para copiar un archivo

12

cp a by cat a > bcual es la diferencia

En el script de instalación x86 del árbol fuente del núcleo de Linux ( arch/x86/boot/install.sh), se usan ambos:

cat $2 > $4/vmlinuz
cp $3 $4/System.map

¿Por qué no mantienen el mismo formato si uno es mejor que el otro?

Qian
fuente

Respuestas:

15

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.

  1. 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
  2. dimensionarlo: no debe ocupar espacio.

    17> du -sh sparsetest
    0       sparsetest
  3. cópielo con cp y verifique el tamaño

    18> cp sparsetest sparsecp
    19> du -sh sparsecp
    0       sparsecp
  4. ahora cópialo con cat y comprueba el tamaño

    20> cat sparsetest > sparsecat
    21> du -sh sparsecat
    1.3M    sparsecat
  5. pruebe sus herramientas preferidas para verificar su comportamiento

  6. 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.

Tatjana Heuser
fuente
1
Entonces crea cpun archivo como el original, mientras catcrea un nuevo archivo con el mismo contenido.
Qian
Ambas herramientas funcionan con contenido, pero cp (al menos implementaciones "modernas") conoce algunas especialidades hoy en día, como los agujeros (las implementaciones antiguas de cat se encontrarán con esa trampa). También hay sistemas de archivos que desconocen el concepto de archivos dispersos, por ejemplo HFS + (MacOS) o FAT (MSDOS, USB-Sticks, etc.), lo que hace que exploten a su tamaño completo. Entonces, hay constelaciones donde cp o cat no harán una diferencia en la práctica.
Tatjana Heuser
Por cierto, GNU 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.
Oguz Ismail
6

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á.

TheoYou
fuente
¿Es esa la razón para atribuir catla rapidez de los atributos?
Nikhil Mulley
2
Es mas catrapido?
Qian
4

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
3
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.
44
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.
Gilles 'SO- deja de ser malvado'
2

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.

Juego de bolos
fuente
3
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á.
Keith Thompson el
¡Buen punto! Entonces vmlinuzno será ejecutable si $2es así.