Створіть тестовий файл з великою кількістю нульових байтів


25

Я знаю, як створити порожній файл:

touch /var/tmp/nullbytes

але як я можу створити файл 1 МБ, який містить лише нульбайти в командному рядку з bash?



1
+1. Цікаве запитання. Може хтось люб’язно розробив, у яких сценаріях потрібен би такий файл ..?
Кент Павар

1
Мені це знадобилося для імітації аварії на chkrootkit: unix.stackexchange.com/questions/86866/…
rubo77

Відповіді:


56

З GNU truncate:

truncate -s 1M nullbytes

(якщо раніше nullbytesне існувало) створив би розріджений файл на 1 мегабайт. Це файл, який видається заповненим нулями, але не займає місця на диску.

Без цього truncateви можете використовувати ddзамість цього:

dd bs=1048576 seek=1 of=nullbytes count=0

(з деякими ddреалізаціями ви можете замінити 1048576 на 1M)

Якщо ви бажаєте виділити дисковий простір , в Linux та деяких файлових системах ви можете зробити:

fallocate -l 1M nullbytes

Це виділяє простір без фактичного запису даних на диск (простір зарезервований, але позначений як неініціалізований).

dd < /dev/zero bs=1048576 count=1 > nullbytes

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

Або @ mikeserv спосіб виправдати ddгенерування байтів NUL:

dd bs=1048576 count=1 conv=sync,noerror 0> /dev/null > nullbytes

Альтернатива з GNU, headщо не передбачає необхідності вказувати розмір блоку (1М нормально, але 10G, наприклад, не буде):

head -c 1M < /dev/zero > nullbytes

Або отримати панель прогресу:

pv -Ss 1M < /dev/zero > nullbytes

Не використовуйте truncateдля створення порожнього файлу, який буде використовуватися як об'єм swap ... це не буде працювати! Використовуйте ddв цьому випадку замість цього.
Ілля Пробст

1
@EliasProbst, натомість копіюйте ITYM з / dev / zero , не використовуйте розріджений файл . ddможна створити розріджені файли, як я показав.
Стефан Шазелас

2
fallocate найкращий і швидкий спосіб створення , оскільки він залишає простір і зробити це швидко , але це не заважає писати що - або ( stackoverflow.com/questions/257844 / ... )
curratore

... або bs=1kx1k. Або <&1 dd bs=1kx1k conv=sync,noerror count="$rpt" | cat >fileдля буквального запису на диск. Однак не на 100%, скільки ефективності може бути втрачено у вимушенні помилки читання.
mikeserv

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