「dd」を使用してファイルの最後の部分を切り取ります


18

これを行うにはおそらく簡単なトリックがありますが、manページからはわかりません。

を使用して、たとえばサイズが未定のファイルから最後の1MBを切り取るにはどうすればよいddですか?


1
最後の1MBを除いて、そのファイルのコピーが必要ですか、または最後のMBを別のファイルにコピーしますか?
マット

最後の1MBが欲しい
ゼータ

回答:


29

statとを持っていると仮定するとbash、次のようにしてファイルサイズを取得できます。

stat -c %s your_file

$amountでそのファイルの最後のバイトを抽出する場合はdd、次のようにします。

dd if=your_file of=extracted_part \
   bs=1 count=$amount \
   skip=$(( $(stat -c %s your_file) - $amount ))

しかし、賢明なアプローチは使用することtailです:

tail -c $(( 1024*1024 )) your_file > target_file

?の-cオプションはありません head
ADTC 14

私は彼が+ $((1024 * 1024))を意味していたと思います:-c、--bytes = Kは最後のKバイトを出力しました。または、-c + Kを使用して、各ファイルのK番目から始まるバイトを出力します
-Vanuan

5
dd-ヘルプ
使用法:dd [オペランド] ...
  または:dd OPTION
ファイルをコピーし、オペランドに従って変換およびフォーマットします。

  bs = BYTESは一度にBYTESバイトの読み取りと書き込みを行います(ibs =、obs =も参照)
  cbs = BYTESは一度にBYTESバイトを変換します
  conv = CONVSは、コンマ区切りの記号リストに従ってファイルを変換します
  count = BLOCKSは、BLOCKS入力ブロックのみをコピーします
  ibs = BYTESは一度にBYTESバイトを読み取ります(デフォルト:512)
  if = FILEはstdinではなくFILEから読み取ります
  iflag = FLAGSは、カンマ区切りの記号リストに従って読み取ります
  obs = BYTESは、一度にBYTESバイトを書き込みます(デフォルト:512)
  of = FILE stdoutの代わりにFILEに書き込みます
  oflag = FLAGSカンマ区切りの記号リストに従って書き込み
  seek = BLOCKSは、出力の開始時にブロックサイズのブロックをスキップします
  skip = BLOCKS入力の開始時にibsサイズのブロックをスキップします
  status = noxferは転送統計を抑制します

BLOCKSとBYTESの後には、次の乗法接尾辞が続く場合があります。
c = 1、w = 2、b = 512、kB = 1000、K = 1024、MB = 1000 * 1000、M = 1024 * 1024、xM = M
GB = 1000 * 1000 * 1000、G = 1024 * 1024 * 1024など、T、P、E、Z、Yの場合

ファイルサイズが正確に10MBの場合、1024 * 10 10240Kこれにより、最後の1024Kが残ります。ibsオプションとobsオプションを使用して、作業中のブロックサイズを指定する必要があります。

1M = 1024K 
1024*9 = 9216  
dd if=/10/MB/file of=/9/MB/file count=9216K ibs=1K obs=1K
dd if=/10/MB/file of=/9/MB/file count=9M ibs=1M obs=1M

また、スキップオプションを使用してファイルの最初の1 MBをスキップし、最初の1 MBをスキップしてファイルの最後まで読み取ることもできます。

dd if=/10/MB/file of=/9/MB/file skip=1M ibs=1M obs=1M

シークオプションを使用すると、出力ファイルの特定の場所にaを書き込むことができます。最初の1MBを保持し、最後の8MBを上書きするとします。

dd if=/10/MB/file of=/9/MB/file skip=1M seek=1M count=8M ibs=1M obs=1M

おそらく、適切な量のデータを入出力するために、ファイルサイズに関する詳細を取得する必要があります。

ls -s --block-size 1K ./my/10MB/file
男ls

       --block-size = SIZE
              SIZEバイトのブロックを使用します。下記のSIZE形式をご覧ください

       -s、-サイズ
              各ファイルに割り当てられたサイズをブロック単位で出力します

       SIZEは、次のいずれか(またはオプションで後に続く整数)のいずれかです。
       lowing:KB 1000、K 1024、MB 1000 * 1000、M 1024 * 1024など、G、T、
       P、E、Z、Y
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.