ddを使用してファイルの終わりを切り取ります。

ddを使用してファイルの終わりを切り取ります。

これを行う簡単な方法があるかもしれませんが、マニュアルページでは理解できません。

たとえば、?を使用してサイズが決定されていないファイルから最後の1MBを切り取る方法は何ですかdd

答え1

statさて、andがあると仮定すると、次のように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

答え2

dd - ヘルプ
使用法: dd [オペランド]...
  または:ddオプション
ファイルをコピーし、オペランドに基づいて変換してフォーマットします。

  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 は、カンマ区切り記号のリストとして書き込みます。
  eek = BLOCKS出力の先頭でBLOCKS obsサイズのブロックをスキップします。
  Skip=BLOCKS 入力開始時に 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

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

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

検索オプションを使用すると、出力ファイルの特定の場所に書き込むことができます。最初の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

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

       -s, --size
              各ファイルの割り当てられたサイズをブロック単位で印刷します。

       SIZEは次のいずれかです(またはオプションで整数が続く場合があります)。
       低:KB 1000、K 1024、MB 1000×1000、M 1024×1024、G、Tなど、
       P、E、Z、Y。

答え3

ファイルをコピーせずにトリミングを使用するには、dd入力ファイルをに設定し、検索ポイントで出力(ターゲット)ファイルをトリミングする/dev/null必要があります。ddたとえば、

dd if=/dev/null of=somefile.txt bs=1M seek=10

切り取る一部のファイル.txt10MB。

ただし、ファイルの長さが可変で、最後に固定量を削除したい場合は、このコマンドを見てくださいtruncate。絶対量または相対量がある可能性があるため、truncate <file> --size=X動作原理はより簡単です。Xまた、新しいサイズが大きい場合は、穴を使用してファイルを1つずつ拡張します。望むより:

$ dd if=/dev/urandom of=somefile.txt bs=1M count=13
13631488 bytes (14 MB, 13 MiB) copied, 0.0661225 s, 206 MB/s
$ ls -lh somefile.txt 
-rw-rw-r-- 1 13M Sep 28 20:18 somefile.txt
$ truncate -s -3M somefile.txt  # remove the trailing 3MB
$ ls -lh somefile.txt 
-rw-rw-r-- 1 10M Sep 28 20:18 somefile.txt

同じを使用しますddが、相対サイズは使用しません。

$ dd if=/dev/urandom of=somefile.txt bs=1M count=13
13631488 bytes (14 MB, 13 MiB) copied, 0.0669367 s, 204 MB/s
$ ls -lh somefile.txt 
-rw-rw-r-- 1 13M Sep 28 20:21 somefile.txt
$ dd if=/dev/null of=somefile.txt bs=1M seek=10
0 bytes copied, 3.6978e-05 s, 0.0 kB/s
$ ls -lh somefile.txt 
-rw-rw-r-- 1 10M Sep 28 20:22 somefile.txt

関連情報