Как вы можете обрезать файлы с помощью командной строки?

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
badp
источник
ddэто единственный традиционный инструмент, который разоблачает seekсистемный вызов (см. dd vs cat - dd все еще актуален в наши дни? но есть и другие способы обработать эту кошку на типичных текущих единицах.
Жиль "

Ответы:

8

Вообще говоря, просто используйте dd; но, как вы упоминаете об использовании виртуализации KVM, вы можете рассмотреть возможность использования qemu-img:

qemu-img create -f raw disk 2G

Это делает то же самое, что ddкоманда в ответе Криса Дауна, эффективно.

Независимо от того, какую команду вы используете для виртуализации, я настоятельно рекомендую использовать fallocateпредварительное распределение блоков, чтобы предотвратить фрагментацию и повысить производительность.

fallocate -l 2G disk

Однако он доступен не на всех платформах и файловых системах. Это не будет записывать нули, а просто назначит блоки файлу, а не делать это по требованию позже каждый раз, когда ему нужно расширить файл.

gertvdijk
источник
Цитата - опечатка?
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 содержит бесконечные нули. О, count = 1, количество байтов для записи не должно быть равным нулю.
Даниэль Фанжул
6

Смотрите также команду GNU truncate:

truncate -s 2G some-file
Стефан Шазелас
источник