Gibt es einen Unterschied zwischen diesen beiden Befehlen?

Gibt es einen Unterschied zwischen diesen beiden Befehlen?
cat a > b

Und

cp a b

Wenn sie im Grunde genommen funktional gleich sind, welches ist schneller?

Antwort1

Von der Funktionalität her sind sie meiner Meinung nach gleich.

Wenn ich raten müsste, was schneller ist, würde ich sagen, dascpBefehl, da sein Zweck darin besteht, Dateivorgänge nur zu Kopierzwecken auszuführen, sodass er hierfür optimiert wäre.

Katzebedeutet dagegenverkettenfiles, also das Zusammenfügen mehrerer Dateien zu einer Reihe. Wenn keine Datei angegeben ist, wird eine Datei auf der Konsole angezeigt (danke an @bahamat für die Erinnerung). In diesem Beispiel wird die Ausgabe in eine andere Datei umgeleitet. Ich denke, diese Umleitung wäre weniger effizient als eine direkte cp.

Ich weiß nicht, ob der Unterschied bei normal großen Dateien spürbar wäre, aber es wäre interessant, die Zeit bei sehr großen Dateien zu messen. Ich denke, man könnte wiederholte Versuche mit /usr/bin/time durchführen und sehen, ob eines durchweg schneller/langsamer ist als das andere.

Gibt es einen besonderen Grund, danach zu fragen, oder ist es einfach nur Neugier (was natürlich überhaupt nichts Schlimmes daran ist)?

Antwort2

Funktionell ähnlich, aber im Wesentlichen unterschiedlich. Im Wesentlichen lesen beide eine Menge Daten aus der ersten Datei und schreiben sie in eine andere Datei.

Wenn ich einestraceunter Linux:

$ strace cat /etc/fstab > test.txt
...
open("/etc/fstab", O_RDONLY|O_LARGEFILE) = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=691, ...}) = 0
fadvise64_64(3, 0, 0, POSIX_FADV_SEQUENTIAL) = 0
read(3, "# /etc/fstab: static file system"..., 32768) = 691
write(1, "# /etc/fstab: static file system"..., 691) = 691
read(3, "", 32768)                      = 0
close(3)                                = 0
close(1)                                = 0
close(2)                                = 0
exit_group(0)                           = ?

$ strace cp /etc/fstab test.log
...
open("/etc/fstab", O_RDONLY|O_LARGEFILE) = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=691, ...}) = 0
open("test.log", O_WRONLY|O_CREAT|O_EXCL|O_LARGEFILE, 0644) = 4
fstat64(4, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
read(3, "# /etc/fstab: static file system"..., 32768) = 691
write(4, "# /etc/fstab: static file system"..., 691) = 691
read(3, "", 32768)                      = 0
close(4)                                = 0
close(3)                                = 0
_llseek(0, 0, 0xbfaa3fb0, SEEK_CUR)     = -1 ESPIPE (Illegal seek)
close(0)                                = 0
close(1)                                = 0
close(2)                                = 0
exit_group(0)                           = ?

Antwort3

Es gibt keinen großen Unterschied: Beide kopieren den Inhalt der alten Datei in eine neue Datei mit demselben Inhalt. Beide überschreiben das Ziel, wenn es eine vorhandene Datei ist.

Einige alte Systeme könnten den Kopiervorgang abbrechen oder Zeilen abschneiden, wenn Sie versuchen, Binärdateien mit zu kopieren cat, da sie an Nullzeichen ersticken könnten. Ich glaube nicht, dass irgendein Unix-System, auf das Sie heute stoßen werden, ein Problem damit hat. cpwird garantiert kein Problem haben.

cpermöglicht die Angabe eines Verzeichnisses als Ziel: Die Datei wird so kopiert, dass sie im neuen Verzeichnis denselben Namen wie das Original hat.

Wenn das Ziel nicht existiert, cpwerden die Berechtigungsbits der Quelldatei verwendet, geändert durch die aktuelleumask.

Sie können sich dabei gegen das Überschreiben der Zieldatei schützen, indem Sie in der Shell cat … >targetdie Option mit setzennoclobberset -C. Gegen das Überschreiben der Zieldatei können Sie sich durch cpÜbergeben der -iOption ( alias cp='cp -i'); schützen, cpSie müssen dann eine Bestätigung abfragen.

Es ist oft sinnvoll, das Datum der Originaldatei beizubehalten. Sie können cp -phierfür verwenden.

Die Leistung variiert je nach Dateigröße, Dateisystem, Art der Quell- und Zielfestplatte, Betriebssystem usw.Für Raw-Disk-Kopien unter Linux, ich habe so gut wie keinen Unterschied festgestellt.

Antwort4

Sieht aus wie eine Katze ist fasterals cp

root@SHW:/tmp# time cp debug.log test1
real    0m0.021s
user    0m0.000s
sys 0m0.000s
root@SHW:/tmp# time cat debug.log > test2
real    0m0.013s
user    0m0.000s
sys 0m0.000s
root@SHW:/tmp# du -h debug.log 
4.0K    debug.log
root@SHW:/tmp# file debug.log
debug.log: ASCII text

verwandte Informationen