Для цього, мабуть, є простий трюк, але я не можу зрозуміти з сторінки man.
Як я можу вирізати останній 1 Мб з файлу з невизначеним розміром, наприклад, використовуючи dd
?
Для цього, мабуть, є простий трюк, але я не можу зрозуміти з сторінки man.
Як я можу вирізати останній 1 Мб з файлу з невизначеним розміром, наприклад, використовуючи dd
?
Відповіді:
Ну, якщо припустити, що ви маєте 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
?
дд --допомога Використання: 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.