Використовуйте `dd`, щоб вирізати кінцеву частину файлу


18

Для цього, мабуть, є простий трюк, але я не можу зрозуміти з сторінки man.

Як я можу вирізати останній 1 Мб з файлу з невизначеним розміром, наприклад, використовуючи dd?


1
Ви хочете копію цього файлу, за винятком останнього 1 МБ, або ви хочете, щоб останній МБ скопіювали в інший файл?
Мат

Я хочу останній 1 МБ
зета

Відповіді:


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

Я думаю, він мав на увазі + $ ((1024 * 1024)): -c, --байт = K виводить останні K байти; альтернативно, використовуйте -c + K для виведення байтів, починаючи з
Kth

5
дд --допомога
Використання: dd [OPERAND] ...
  або: dd ВАРІАНТ
Скопіюйте файл, перетворюючи та форматуючи відповідно до операндів.

  bs = BYTES одночасно читає і записує байти BYTES (також див. ibs =, obs =)
  cbs = BYTES конвертувати одночасно байт BYTES
  conv = CONVS конвертувати файл відповідно до списку символів, розділених комами
  count = БЛОКИ копіюють лише блоки вводу BLOCKS
  ibs = BYTES одночасно читає байти BYTES (за замовчуванням: 512)
  if = FILE, прочитаний з FILE замість stdin
  iflag = ФЛАГИ читаються відповідно до списку символів, розділених комами
  obs = BYTES одночасно записує байти BYTES (за замовчуванням: 512)
  of = FILE написати у FILE замість stdout
  oflag = FLAGS записати відповідно до списку символів, розділених комами
  шукати = BLOCKS пропустити блоки BLOCKS нерозмірного розміру на початку виведення
  skip = BLOCKS пропустити блоки BLOCKS ibs на початку введення
  status = noxfer придушує статистику передачі

БЛОКИ та БЮТИ можуть супроводжуватися такими мультипликаційними суфіксами:
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.

Якщо розмір файлу рівно 10МБ, 1024 * 10 10240К. Це залишить останні 1024 Кб. Ви повинні вказати розмір блоку, з яким ви працюєте, використовуючи параметри 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 МБ файлу, скориставшись опцією пропуску, щоб прочитати до кінця файлу, пропустивши перший 1 МБ.

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

Використовуючи опцію пошуку, ви можете записати на певне місце у вихідному файлі. Скажіть, що ви хочете зберегти перший 1 МБ і більше написати останній 8 МБ.

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
людина лс

       --block-size = SIZE
              використовувати SIZE-байтові блоки. Дивіться формат SIZE нижче

       -s, --размер
              друкувати виділений розмір кожного файлу в блоках

       SIZE може бути (або може бути цілим числом, необов'язково супроводжуватися) одним із фолів
       пониження: КБ 1000, К 1024, МБ 1000 * 1000, М 1024 * 1024 тощо для G, T,
       P, E, Z, Y.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.