Muszę połączyć fragmenty z dwóch plików:
gdybym potrzebował połączyć całe pliki, mógłbym to zrobić
cat file1 file2 > output
Ale muszę pominąć pierwszy 1 MB z pierwszego pliku i chcę tylko 10 MB z drugiego pliku. Brzmi jak praca dla 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
Czy jest to możliwe w jednym kroku? tzn. bez potrzeby zapisywania wyników pośrednich? Czy mogę używać wielu plików wejściowych dd
?
oflag=append conv=notrunc
), więc systemy plików, które dokonują opóźnionego przydzielania (jak XFS), mają najmniejszą szansę na stwierdzenie, że plik jest zapisywany, gdy jest jeszcze wiele do zrobienia.dd
nie zostaniesz o to poproszonysync
, opóźnione przydzielanie nie powinno i tak zostać natychmiast uruchomione (chyba że pamięć jest za mała, w którym to przypadku żadna metoda nie opóźni przydzielenia).bash
imksh
że nie optymalizuje się widelec do ostatniego polecenia w podpowłoce, można je nieco bardziej efektywny poprzez zastąpienie powłoki w tle z grupy poleceń. W przypadku innych powłok nie powinno to mieć znaczenia, a podejście do podpowłoki może być nawet nieco bardziej wydajne, ponieważ powłoka nie musi zapisywać i przywracać standardowego wyjścia.Nie sądzę, że możesz łatwo odczytać wiele plików w jednym
dd
wywołaniu, ale możesz dołączyć, aby zbudować plik wyjściowy w kilku krokach:Musisz określić zarówno, jak
conv=notrunc
ioflag=append
. Pierwszy unika obcięcia danych wyjściowych, drugi zaczyna pisać od końca istniejącego pliku.źródło
Należy pamiętać, że
dd
jest surowy interfejs doread()
,write()
ilseek()
wywołanie systemowe. Można go używać tylko w sposób niezawodny, aby wyodrębnić fragmenty danych ze zwykłych plików, zablokować urządzenia i niektóre urządzenia znakowe (np./dev/urandom
), Czyli pliki, którychread(buf, size)
powrót jest gwarantowany,size
dopóki nie zostanie osiągnięty koniec pliku.W przypadku potoków, gniazd i większości urządzeń znakowych (takich jak ttys) nie masz takiej gwarancji, chyba że zrobisz
read()
to w rozmiarze 1 lub użyjeszdd
rozszerzenia GNUiflag=fullblock
.Więc albo:
Lub:
Lub z powłokami z wbudowanym wsparciem dla operatora wyszukiwania, takiego jak
ksh93
:Lub
zsh
(zakładając, żehead
obsługuje tę-c
opcję tutaj):źródło
$IFS
. Niezależnie od zawartości zmiennej / rozszerzenia. Zobacz także Implikacje bezpieczeństwa dla zapomnienia o cytowaniu zmiennej w powłokach bash / POSIXgdd
zamiastdd
. Czy to literówka, czy jest to celowe?Dzięki bash ism i funkcjonalnie „bezużytecznemu użyciu cat ”, ale najbliższym składni, której używa OP:
(Biorąc to pod uwagę, odpowiedź Stephena Kitta wydaje się być najbardziej efektywną metodą).
źródło
<(...)
to kszizm, który zarówno skopiował, jakzsh
i obajbash
.