これを行う簡単な方法があるかもしれませんが、マニュアルページでは理解できません。
たとえば、?を使用してサイズが決定されていないファイルから最後の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