cp vs. cat per copiare un file


12

cp a be cat a > bqual è la differenza?

Nello script di installazione x86 dell'albero dei sorgenti del kernel linux ( arch/x86/boot/install.sh), vengono utilizzati entrambi:

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

Perché non mantengono lo stesso formato solo se uno è migliore dell'altro?

Risposte:


15

Un altro problema mi viene in mente dove catvs. cpfa una differenza significativa:

Per definizione, cat espanderà i file sparsi, riempiendo gli spazi con byte zero "reali", mentre almeno si può dire a cp di preservare i buchi.

I file sparsi sono file in cui sequenze di zero byte sono state sostituite da metadati per preservare lo spazio. Puoi provare creando uno con dd e duplicarlo con gli strumenti che preferisci.

  1. Crea un file sparso (cambiando prima in / tmp per evitare problemi - vedi nota finale):

    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. dimensionalo - non dovrebbe occupare spazio.

    17> du -sh sparsetest
    0       sparsetest
  3. copiarlo con cp e controllare le dimensioni

    18> cp sparsetest sparsecp
    19> du -sh sparsecp
    0       sparsecp
  4. ora copiarlo con il gatto e controllare le dimensioni

    20> cat sparsetest > sparsecat
    21> du -sh sparsecat
    1.3M    sparsecat
  5. prova i tuoi strumenti preferiti per verificarne il comportamento

  6. non dimenticare di pulire.

Nota finale di cautela: esperimenti come questi hanno la possibilità intrinseca di accrescere la tua fama con il tuo sysadmin locale se li stai facendo su un filesystem che fa parte del suo piano di backup, o critico per il benessere del sistema. A seconda della scelta dello strumento per il backup, potrebbe finire per aver bisogno di più supporti su nastro di quanti abbia mai ritenuto possibile eseguire il backup di quel file a 0 byte che viene espanso in terabyte di zero.

Altri file che non possono essere copiati né con cat né con cp includerebbero file speciali per dispositivo, ecc. Dipende dall'implementazione dello strumento di copia se è in grado di duplicare il nodo del dispositivo o se invece ne copia allegramente il suo contenuto.


1
Quindi cpcrea un file proprio come l'originale, mentre catcrea un nuovo file con lo stesso contenuto.
Qian,

Entrambi gli strumenti operano sul contenuto, ma cp (almeno implementazioni "moderne") è al corrente di alcune specialità al giorno d'oggi, come i buchi (le vecchie implementazioni del gatto si imbatteranno in quella trappola). Esistono anche filesystem che non sono consapevoli del concetto di file sparsi, ad esempio HFS + (MacOS) o FAT (MSDOS, chiavette USB, ecc.), Causandone l'espansione a grandezza naturale. Quindi ci sono costellazioni in cui cp o cat non faranno la differenza nella pratica.
Tatjana Heuser,

A proposito, GNU cpha un'opzione per controllare il suo comportamento su file sparsi; come, con --sparse=neverspecificato sulla riga di comando, cpè lento quanto cat.
Oguz Ismail,

6

Secondo il commento di Keith , cpconserva alcune autorizzazioni e catcrea il nuovo file come umaskindicato. Quindi $2il permesso non viene conservato $4/vmlinuzabbastanza pulito, mentre se viene impostato uno strano permesso $3, $4/System.maplo manterrà.


è questa la ragione per attribuire catla sfacciataggine?
Nikhil Mulley,

2
È catpiù veloce?
Qian,

4

Entrambi hanno funzionalità equivalenti in questi due casi, ma cp è puramente un'operazione di file. "Prendi questo file e creane una copia laggiù".

cat, d'altra parte, è destinato a scaricare il contenuto di un file sulla console. "Prendi questo file e visualizzalo sullo schermo", quindi un ninja attacca lo schermo e reindirizza l'output altrove.

cp sarebbe generalmente più efficiente, dato che non c'è solo il reindirizzamento, solo una copia diretta dei byte dalla posizione A alla posizione B.

gatto sarebbe read bytes -> output to console -> intercept output -> redirect to new file.


3
catnon lo sarà output to console -> intercept output -> redirect to new file, il file di output per cat può essere stdout o un file normale, verrà semplicemente emesso nel file, purché l'input non sia uguale all'output.

4
catnon ha nulla a che fare con la console. Entrambi cate cpleggere dal file di input e scrivere nel file di output. Con cat, il file di output viene aperto dalla shell, mentre con cp, il file di output viene aperto da cp; questo non fa differenza nelle prestazioni. cppuò essere più veloce, ma per una ragione completamente diversa: alcune implementazioni di cptentano di indovinare la giusta dimensione del pezzo per le prestazioni a seconda dei dispositivi di origine e di destinazione; un'implementazione di catnon disturberebbe.
Gilles 'SO- smetti di essere malvagio' il

2

È davvero una questione di preferenza, IMHO.

Non c'è tecnicamente alcuna differenza reale a meno che non si usi il comando cp con l'opzione -p per conservare la proprietà / il gruppo del file. Altrimenti, è la stessa cosa funzionalmente. La risposta di Marc è molto più chiaramente dettagliata e precisa.


3
cpsenza -pconserva alcune autorizzazioni. Ad esempio, se il file di origine è eseguibile, cprenderà eseguibile il file di destinazione, ma catnon lo sarà.
Keith Thompson,

Buon punto! Quindi vmlinuznon sarà eseguibile se lo $2è.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.