cp vs. cat, um eine Datei zu kopieren

12

cp a bund cat a > bwas ist der Unterschied?

Im x86-Installationsskript des Quellbaums ( arch/x86/boot/install.sh) des Linux-Kernels werden beide verwendet:

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

Warum behalten sie nicht einfach das gleiche Format bei, wenn eines besser ist als das andere?

Qian
quelle

Antworten:

14

Ein weiteres Problem fällt mir ein, bei dem catvs. cpeinen signifikanten Unterschied macht:

Per Definition erweitert cat spärliche Dateien und füllt die Lücken mit "echten" Null-Bytes, während cp zumindest angewiesen werden kann, die Löcher zu erhalten.

Sparse-Dateien sind Dateien, in denen Sequenzen von null Byte durch Metadaten ersetzt wurden, um Speicherplatz zu sparen. Sie können testen, indem Sie eine mit dd erstellen und mit den Tools Ihrer Wahl duplizieren.

  1. Erstellen Sie eine Datei mit geringer Dichte (ändern Sie vorher zu / tmp, um Probleme zu vermeiden - siehe letzte Anmerkung):

    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. Größe es - es sollte keinen Platz nehmen.

    17> du -sh sparsetest
    0       sparsetest
  3. kopiere es mit cp und überprüfe die Größe

    18> cp sparsetest sparsecp
    19> du -sh sparsecp
    0       sparsecp
  4. Kopieren Sie es jetzt mit Katze und überprüfen Sie die Größe

    20> cat sparsetest > sparsecat
    21> du -sh sparsecat
    1.3M    sparsecat
  5. Probieren Sie Ihre bevorzugten Tools aus, um deren Verhalten zu überprüfen

  6. Vergiss nicht aufzuräumen.

Letzte Warnung: Experimente wie diese haben die Chance, Ihren Ruhm bei Ihrem lokalen Systemadministrator zu steigern, wenn Sie sie auf einem Dateisystem ausführen, das Teil seines Sicherungsplans ist oder für das Wohlbefinden des Systems von entscheidender Bedeutung ist. Abhängig von seiner Wahl des Tools für die Sicherung benötigt er möglicherweise mehr Bandmedien, als er jemals für möglich gehalten hätte, um diese eine 0-Byte-Datei zu sichern, die auf Terabyte von Nullen erweitert wird.

Andere Dateien, die weder mit cat noch mit cp kopiert werden können, enthalten gerätespezifische Dateien usw. Es hängt von Ihrer Implementierung des Kopiertools ab, ob der Geräteknoten dupliziert werden kann oder ob er stattdessen seinen Inhalt fröhlich kopiert.

Tatjana Heuser
quelle
1
So cpwird eine Datei genau wie das Original erstellt, während cateine neue Datei mit demselben Inhalt erstellt wird.
Qian
Beide Tools arbeiten mit Inhalten, aber cp (zumindest "moderne" Implementierungen) kennt heutzutage einige Besonderheiten, wie Löcher (alte Implementierungen von cat werden in diese Falle geraten). Es gibt auch Dateisysteme, die das Konzept von Dateien mit geringer Dichte nicht kennen, z. B. HFS + (MacOS) oder FAT (MSDOS, USB-Sticks usw.), wodurch sie auf ihre volle Größe gesprengt werden. Es gibt also Konstellationen, in denen cp oder cat in der Praxis keinen Unterschied machen.
Tatjana Heuser
Übrigens hat GNU cpeine Option zur Steuerung des Verhaltens bei Dateien mit geringer Dichte. like, mit --sparse=neverin der Kommandozeile angegeben, cpist so langsam wie cat.
Oguz Ismail
6

Laut Keith Kommentar , cpbewahrt einige Berechtigungen, und caterstellt die neue Datei als umaskangibt. So $2ist die Erlaubnis nicht erhalten , die $4/vmlinuzziemlich sauber ist, während , wenn einige seltsame Erlaubnis gesetzt auf $3, $4/System.mapwird diese halten.

TheoYou
quelle
ist das der Grund, die catFasternität zuzuschreiben?
Nikhil Mulley
2
Ist catschneller?
Qian
4

Beide haben in diesen beiden Fällen die gleiche Funktionalität, aber cp ist eine reine Dateioperation. "Nehmen Sie diese Datei und machen Sie dort eine Kopie davon".

cat hingegen soll den Inhalt einer Datei auf die Konsole übertragen. "Nehmen Sie diese Datei und zeigen Sie sie auf dem Bildschirm an" und lassen Sie dann einen Ninja den Bildschirm angreifen und die Ausgabe an eine andere Stelle umleiten.

cp wäre im Allgemeinen effizienter, da nur eine Umleitung stattfindet, sondern lediglich ein direktes Kopieren von Bytes von Position A nach Position B.

Katze wäre read bytes -> output to console -> intercept output -> redirect to new file.


quelle
3
catnicht wirklich output to console -> intercept output -> redirect to new file, die Ausgabedatei für cat kann stdout oder eine normale Datei sein, sie wird nur in die Datei ausgegeben, solange die Eingabe nicht mit der Ausgabe identisch ist.
4
cathat nichts mit der Konsole zu tun. Beides catund cpaus der Eingabedatei lesen und in die Ausgabedatei schreiben. Mit catwird die Ausgabedatei von der Shell geöffnet, während mit cpdie Ausgabedatei von geöffnet wird cp. Dies macht keinen Unterschied in der Leistung. cpMöglicherweise schneller, aber aus einem ganz anderen Grund: Einige Implementierungen cpversuchen, die richtige Blockgröße für die Leistung in Abhängigkeit von den Quell- und Zielgeräten zu erraten. eine Implementierung von catwürde nicht stören.
Gilles 'SO - hör auf böse zu sein'
2

Es ist wirklich eine Frage der Präferenz, IMHO.

Es gibt technisch gesehen keinen wirklichen Unterschied, es sei denn, Sie verwenden den Befehl cp mit dem Schalter -p, um den Dateieigentum / die Dateigruppe zu erhalten. Ansonsten ist es funktional dasselbe. Marc's Antwort ist jedoch viel klarer und genauer.

Kegelspiel
quelle
3
cpohne -pbehält einige Berechtigungen bei. Wenn die Quelldatei beispielsweise ausführbar ist, cpwird die Zieldatei ausführbar, jedoch catnicht.
Keith Thompson
Guter Punkt! Also vmlinuzwird nicht ausführbar sein, ob es $2ist.