Jak zrobić coś takiego dd if=somefile bs=1 skip=1337 count=31337000
, ale wydajnie, nie używając nieczytelnych odczytów i zapisów?
Oczekiwane jest rozwiązanie:
- Mówiąc prościej (dla nie-prostych mogę napisać perel oneliner, który to zrobi)
- Do obsługi dużych przesunięć i długości (więc hacki o rozmiarze bloku w dd nie pomogą)
Częściowe rozwiązanie (nie dość proste, próba tego samego z długością sprawi, że będzie jeszcze bardziej skomplikowana):
dd if=somefile bs=1000 skip=1 count=31337 | { dd bs=337 count=1 of=/dev/null; rest_of_pipeline; }
# 1337 div 1000 and 1337 mod 1000
Odpowiedzi:
To powinno to zrobić (na gnu dd):
Jeśli również używasz
seek=
, możesz również rozważyćoflag=seek_bytes
.Od
info dd
:Ps: Rozumiem, że to pytanie jest stare i wydaje się, że te flagi zostały zaimplementowane po tym, jak pytanie zostało pierwotnie zadane, ale ponieważ jest to jeden z pierwszych wyników google dla pokrewnego wyszukiwania dd, które zrobiłem, myślę, że byłoby miło zaktualizować za pomocą nowego cecha.
źródło
Użyj jednego procesu, aby porzucić wszystkie początkowe bajty, a następnie drugiego, aby odczytać rzeczywiste bajty, np .:
Drugi
dd
może odczytać dane wejściowe przy dowolnym rozmiarze bloku, który uważasz za skuteczny. Zauważ, że wymaga to dodatkowego procesu do odrodzenia; w zależności od systemu operacyjnego, który będzie ponosił koszty, ale prawdopodobnie jest mniejszy niż konieczność czytania plików jeden po drugim bajcie (chyba że masz bardzo mały plik, w którym to przypadku nie będzie problemu).źródło
dd if=/dev/sda bs=10000000001 | dd bs=255 count=1 | hd
-> „dd: nieprawidłowy numer„ 10000000001 ””dd if=/dev/sda bs=16M skip=596 count=1 | dd bs=512 skip=1522 count=1 | (dd bs=1 count=1 of=/dev/null ; dd bs=255 count=1)
read -n
byłoby pominąć? A potemhead -c
liczyć? Np.cat somefile | (read -n 1337; head -c 31337000)
Albo możesz to zrobić bez odradzania dodatkowego procesu:exec 3<somefile; read -n 1337 -u 3; head -c 31337000 <&3
Zamiast
bs=1
używaćbs=4096
lub więcej.źródło
f.seek(1337)
przed użyciemread(MY_CHUNK_SIZE)
Możesz wypróbować polecenie hexdump:
Jeśli chcesz po prostu zobaczyć zawartość:
źródło