Ich muss Blöcke aus zwei Dateien verketten:
Wenn ich ganze Dateien verketten müsste, könnte ich das einfach tun
cat file1 file2 > output
Aber ich muss zuerst 1 MB aus der ersten Datei auslassen, und ich möchte nur 10 MB aus der zweiten Datei. Klingt nach einem Job für dd
.
dd if=file1 bs=1M count=99 skip=1 of=temp1
dd if=file2 bs=1M count=10 of=temp2
cat temp1 temp2 > final_output
Gibt es eine Möglichkeit, dies in einem Schritt zu tun? dh ohne dass die Zwischenergebnisse gespeichert werden müssen? Kann ich mehrere Eingabedateien in verwenden dd
?
oflag=append conv=notrunc
), sodass Dateisysteme mit verzögerter Zuweisung (wie XFS) mit der geringsten Wahrscheinlichkeit entscheiden, dass das Schreiben der Datei abgeschlossen ist, wenn noch mehr zu tun ist.dd
nicht darum gebeten wird,sync
sollte die verzögerte Zuweisung nicht sofort aktiviert werden (es sei denn, der Speicher ist knapp, in diesem Fall verschiebt keine der Methoden die Zuweisung).bash
undmksh
, die die Verzweigung für den letzten Befehl in einer Subshell nicht optimieren, können Sie sie etwas effizienter gestalten, indem Sie die Subshell durch eine Befehlsgruppe ersetzen. Für andere Shells sollte dies keine Rolle spielen, und der Ansatz für Subshells ist möglicherweise sogar etwas effizienter, da die Shell stdout nicht speichern und wiederherstellen muss.Ich glaube nicht, dass Sie einfach mehrere Dateien in einem einzigen
dd
Aufruf lesen können , aber Sie können die Ausgabedatei in mehreren Schritten anhängen:Sie müssen beide
conv=notrunc
und angebenoflag=append
. Der erste vermeidet das Abschneiden der Ausgabe, der zweite beginnt mit dem Schreiben am Ende der vorhandenen Datei.quelle
Denken Sie daran , dass
dd
eine rohe Schnittstelle zu der istread()
,write()
undlseek()
Systemaufruf. Sie können es nur zuverlässig verwenden, um Datenblöcke aus regulären Dateien, Blockgeräten und einigen Zeichengeräten (z. B./dev/urandom
) zu extrahieren. Dies sind Dateien, für dieread(buf, size)
eine Rückgabe garantiert ist,size
solange das Ende der Datei nicht erreicht wird.Für Pipes, Sockets und die meisten Zeichengeräte (wie ttys) gibt es keine solche Garantie, es sei denn, Sie haben die
read()
Größe 1 oder verwenden die GNU-dd
Erweiterungiflag=fullblock
.Also entweder:
Oder:
Oder mit Shells mit eingebauter Unterstützung für einen Suchoperator wie
ksh93
:Oder
zsh
(vorausgesetzt, Siehead
unterstützen die-c
Option hier):quelle
$IFS
. Das ist unabhängig vom Inhalt der Variablen / Erweiterung. Siehe auch Auswirkungen auf die Sicherheit, wenn Sie vergessen, eine Variable in bash / POSIX-Shells zu zitierengdd
stattdd
. Ist das ein Tippfehler oder ist das beabsichtigt?Mit einem Bash- Ismus und einer funktional "nutzlosen Verwendung von cat ", die jedoch der Syntax am nächsten kommt, die das OP verwendet:
(Davon abgesehen scheint Stephen Kitts Antwort die effizienteste Methode zu sein.)
quelle
<(...)
ist es ein Kshismus, der sowohl kopiertzsh
als auchbash
kopiert wird.