Як можна обрізати файли за допомогою командного рядка?


18

Що таке консольний еквівалент наступного коду Python:

target = file("disk", "w")    # create a file
target.seek(2*1024*1024*1024) # skip to 2 GB
target.write("\0")
target.close()

Можливо, якась заклинання до ДД? Ідея полягає в тому, щоб зробити файл розміром з 2 ГБ для використання, наприклад, для віртуалізації.

kvm disk -cd whatever.iso #Only allocate space as necessary

ddце єдиний традиційний інструмент , який виставляє seekсистемний виклик (див дд проти кішки -? ДД по- , як і раніше актуальна в наші дні , але є й інші способи шкіри цієї кішки на типових поточних Юнікси.
Жиля SO- перестати бути злими "

Відповіді:


8

Взагалі кажучи, просто використовувати dd; але коли ви згадуєте про використання віртуалізації KVM, ви можете розглянути можливість використання qemu-img:

qemu-img create -f raw disk 2G

Це робить те саме, що і ddкоманда у відповіді Кріса Дауна, ефективно.

Незалежно від того, яку команду ви використовуєте, для використання у віртуалізації я б настійно рекомендував використовувати fallocateдля попереднього виділення блоків, щоб запобігти фрагментації та підвищити продуктивність.

fallocate -l 2G disk

Однак він доступний не на всіх платформах і файлових системах. Це не записує нулі, а просто призначає блоки файлу, а не робить це на вимогу пізніше кожного разу, коли йому доведеться розширювати файл.


Чи цитата помилкова?
badp

@badp так, виправлено.
gertvdijk

2
qemu-imgі ddобидва виконують один системний виклик, щоб встановити розмір файлу (ftruncate), але виконають набагато більше для завантаження себе та бібліотек, до яких вони пов'язані. І в цьому плані ddбуде набагато ефективніше, ніж qemu-img(що набагато більше і пов'язане з набагато більшою кількістю бібліотек). GNU truncateбуде ще ефективнішим. ddтакож має перевагу бути всюдисущим. Хороший момент про fallocateте, хоча.
Стефан Шазелас

@StephaneChazelas Я повністю другий ваш коментар. Я відредагував свою відповідь, щоб зазначити, що qemu-imgце лише очевидна альтернатива у використанні віртуалізації KVM.
gertvdijk

14

Ви можете створити розріджений файл на зразок цього за допомогою dd:

dd of=file bs=1 seek=2G count=0
$ du file
0       disk
$ du --apparent-size file
2097152 disk

4
Також 2Gє розширенням GNU до dd. Ви можете використовувати, bs=1024 seek=2097152якщо у вас немає GNU dd.
Кріс Даун

Хе, Gце розширення, і його не підтримує версія OpenBSD від dd ... але, Mі Kпідтримується, тому, можливо seek=2048M, це трохи читабельніше, залежно від того, на які платформи ви
націлені

Вам слід прочитати з / dev / zero: if = / dev / zero
Даніель Фанджул

@DanielFanjul Чому? Різниці абсолютно немає, байти не записуються.
Кріс Даун

@ChrisDown Оскільки / dev / null не містить даних, коли ви читаєте, але / dev / zero містить нескінченні нулі. О, порахуйте = 1, кількість байтів для запису не повинна бути нульовою.
Даніель Фанджул

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.