निर्दिष्ट ऑफसेट से फ़ाइल कैसे आउटपुट करें, लेकिन "dd bs = 1 स्किप = एन" नहीं?


28

dd if=somefile bs=1 skip=1337 count=313370001-बाइट नहीं पढ़ता और लिखता है, जैसे कि कैसे बात करें , लेकिन कुशलता से?

समाधान अपेक्षित है:

  1. सरल होने के लिए (गैर-सरल के लिए मैं कुछ पर्ल ऑनलाइनर लिख सकता हूं जो ऐसा करेगा)
  2. बड़े ऑफसेट और लंबाई का समर्थन करने के लिए (इसलिए dd में ब्लॉक साइज वाले हैक्स मदद नहीं करेंगे)

आंशिक समाधान (पर्याप्त सरल नहीं, लंबाई के साथ ही कोशिश करना इसे और भी जटिल बना देगा):

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

क्या आप उस dd का उपयोग करने वाले blockize को बदलने की कोशिश कर रहे हैं?
cmorse

परिवर्तित ब्लॉक => बदले और गिनती के लिए बदल इकाइयों
Vi।

जवाबों:


37

इसे करना चाहिए (गन्नू पर):

dd if=somefile bs=4096 skip=1337 count=31337000 iflag=skip_bytes,count_bytes

यदि आप उपयोग कर रहे हैं seek=तो आप इस पर भी विचार कर सकते हैं oflag=seek_bytes

से info dd:

`count_bytes'
      Interpret the `count=' operand as a byte count, rather than a
      block count, which allows specifying a length that is not a
      multiple of the I/O block size.  This flag can be used only
      with `iflag'.

`skip_bytes'
      Interpret the `skip=' operand as a byte count, rather than a
      block count, which allows specifying an offset that is not a
      multiple of the I/O block size.  This flag can be used only
      with `iflag'.

`seek_bytes'
      Interpret the `seek=' operand as a byte count, rather than a
      block count, which allows specifying an offset that is not a
      multiple of the I/O block size.  This flag can be used only
      with `oflag'.

Ps: मैं समझता हूं कि यह प्रश्न पुराना है और ऐसा लगता है कि ये ध्वज प्रश्न के मूल रूप से पूछे जाने के बाद लागू किए गए थे, लेकिन चूंकि यह मैंने संबंधित dd खोज के लिए पहले Google परिणामों में से एक है, मैंने किया था, हालाँकि इसे नए के साथ अपडेट करना अच्छा होगा सुविधा।


2

सभी प्रारंभिक बाइट्स को खोदने के लिए एक प्रक्रिया का उपयोग करें, फिर वास्तविक बाइट्स पढ़ने के लिए एक सेकंड, उदाहरण के लिए:

echo Hello, World\! | ( dd of=/dev/null bs=7 count=1 ; dd bs=5 count=1 )

दूसरा ddउस इनपुट को पढ़ सकता है जिसके साथ आप जो भी ब्लॉक करते हैं वह आपको कुशल लगता है। ध्यान दें कि इसके लिए एक अतिरिक्त प्रक्रिया की आवश्यकता होती है; आपके ओएस पर निर्भर करता है कि एक लागत खर्च होगी, लेकिन यह संभवतया एक-एक बाइट फ़ाइलों को पढ़ने की तुलना में छोटा है (जब तक कि आपके पास बहुत छोटी फ़ाइल नहीं है, जिस स्थिति में समस्या नहीं होगी)।


क्या यह बड़े ऑफ़सेट्स और काउंट्स के लिए अच्छी तरह से काम करेगा (यानी बहुत अधिक मेमोरी हॉग नहीं करेगा)? dd if=/dev/sda bs=10000000001 | dd bs=255 count=1 | hd-> "dd: अमान्य संख्या` 10000000001 '"
Vi।

@Vi। यदि आप एक विशाल ऑफसेट को छोड़ना चाहते हैं तो आपको प्रारंभिक रीड "आदर्श" (अपने स्रोत के आधार पर) आकार के ब्लॉक (16M) की एक श्रृंखला के रूप में करना चाहिए, फिर कम आकार के ब्लॉक (512) की एक श्रृंखला को छोड़ दें जो कि मेमोरी में होगी , अपने डेटा पर "ज़ूम" करने के लिए, इससे पहले कि आप एक विषम विभाजन को छोड़ दें जो ब्लॉक आकार (bs = 1 नीचे) फिट नहीं करता है और फिर इच्छित ब्लॉक पढ़ें। उदाहरण के लिए, आप ऑफसेट 10000000001 से 255 बाइट्स पढ़ना चाहते हैं: 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)
RolKau

निश्चित रूप से इसे read -nस्किप करने के लिए उपयोग करना आसान होगा ? और फिर head -cगिनना है? जैसे cat somefile | (read -n 1337; head -c 31337000)या आप इसे बिना किसी अतिरिक्त प्रक्रिया के कर सकते हैं:exec 3<somefile; read -n 1337 -u 3; head -c 31337000 <&3
गनेट

1

इसके बजाय bs=1उपयोग bs=4096या अधिक।


2
फिर यह 1337 के बजाय ऑफसेट 1337 * 4096 से पढ़ा जाएगा
वीआई।

1
अहा, मैं देख रहा हूं, तो शायद एक साधारण पायथन स्क्रिप्ट लिखना आसान होगा, उदाहरण के लिए इस उदाहरण में जैसे stackoverflow.com/questions/1035340/…f.seek(1337) उपयोग करने से पहलेread(MY_CHUNK_SIZE)
ccpizza

ऐसा लगता है कि सबसे विश्वसनीय तरीका शायद एक कस्टम निष्पादन योग्य लिखना है। कुछ प्रणालियों में पायथन, या रूबी, या यहां तक ​​कि पर्ल नहीं हैं। : |
तर्जुक

1

आप हेक्सडंप कमांड की कोशिश कर सकते हैं:

hexdump  -v <File Path> -c -n <No of bytes to read> -s <Start Offset>

यदि आप केवल सामग्री देखना चाहते हैं:

#/usr/bin/hexdump -v -C mycorefile -n 100 -s 100
00000064 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 
00000074 00 00 00 00 01 00 00 00 05 00 00 00 00 10 03 00 |................| 
00000084 00 00 00 00 00 00 40 00 00 00 00 00 00 00 00 00 |......@.........| 
00000094 00 00 00 00 00 00 00 00 00 00 00 00 00 a0 03 00 |................| 
000000a4 00 00 00 00 00 10 00 00 00 00 00 00 01 00 00 00 |................| 
000000b4 06 00 00 00 00 10 03 00 00 00 00 00 00 90 63 00 |..............c.| 
000000c4 00 00 00 00 |....| 
000000c8 #

यह फ़ाइल को हेक्स के रूप में देखने के बारे में नहीं है। यह एक फ़ाइल की सामग्री को निकालने के बारे में है (उदाहरण के लिए, इसे कहीं कॉपी करने के लिए) बाइट्स में निर्दिष्ट ऑफसेट से।
वि।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.