Bir dosya istenilen boyuta nasıl doldurulur?


15

16 MiB'ye (16777216 bayt) ulaşıncaya kadar doldurmak istediğim bir dosya var. Şu anda 16515072 bayt. Fark 262144 bayttır.

Nasıl doldururum?

Bu işe yaramıyor gibi görünüyor:

cp smallfile.img largerfile.img
dd if=/dev/zero of=largerfile.img bs=1 count=262144

2
@terabyte; fiziksel dolgu veya mantıksal dolgu ister misiniz? Diğer bir deyişle; dosya yalnızca 16777216 boyutunda mı (delikler içerebilir) mi yoksa diskte bu kadar depolama alanı kaplamalı mı? - BTW, bir bs=1in seçimi ddbenim deneyimime göre çok çalışma zamanı pahalı.
Janis

5
truncate -s 16M thefile
frostschutz

4
@frostschutz, bu iyi bir cevap olurdu, bir cevap olarak yayınlayacak mıydınız?
derobert

@derobert, StackExchange sitesi kullanıcılarının okunaklı, basit cevapları yorum olarak gönderen nedir?
user1717828

@ user1717828 emin değilim, muhtemelen meta için iyi bir soru.
derobert

Yanıtlar:


10

Bırakın of=largerfile.txtve stdout'u dosyaya ekleyin:

dd if=/dev/zero bs=1 count=262144 >> largerfile.txt

1
seekburada doğru bir seçenektir.
0andriy

15

Fiziksel bir dolgu almak için verilen cevapların yanı sıra, dosyanın seekyeni son konumuna gelip tek bir karakter yazarak dosyadaki dolgu alanının çoğunu boş bırakabilirsiniz ("delikler") :

dd if=/dev/zero of=largerfile.txt bs=1 count=1 seek=16777215

(özellikle daha fazla performans sergileme avantajına sahiptir ve özellikle fazla bs=1miktarda disk alanı işgal etmez).

Bu yöntem, herhangi bir karakter eklemeden bile if=/dev/nullve son istenen dosya boyutunu kullanarak çalışıyor gibi görünüyor :

dd if=/dev/null of=largerfile.txt bs=1 count=1 seek=16777216

Daha büyük blok boyutları kullanan fiziksel bir dolgu çözümünün performanslı bir çeşidi:

padding=262144 bs=32768 nblocks=$((padding/bs)) rest=$((padding%bs))
{
  dd if=/dev/zero bs=$bs count=$nblocks
  dd if=/dev/zero bs=$rest count=1
} 2>/dev/null >>largerfile.txt

3
Doğru. Bu durumda truncate -s +262144 largerfile.txtda hızlı olur.
don_crissti

4

Buradaki en iyi anwser, Janis'in (yukarıda) olmasıdır, çünkü mevcut dosya boyutunu ve herhangi bir hesaplama yapmadan doğrudan istenen boyuta kadar yastığı unutmanızı sağlar.

Ayrıca / dev / zero eklenmeyen seyrek dosyalardan da yararlanır.

Yine de cevap daha düzenli olabilir, çünkü 'sayı'nın 0 olmasına izin verilir ve yine de dolgu alırsınız:

dd if=/dev/null of=largerfile.txt bs=1 count=0 seek=16777216

(Düzenleme: bu GNU dd için doğrudur, ancak davranışı count=0platforma özgüdür, yorumlara bakın)


Yanılıyorsunuz: count=0belirtilmemiş, ancak genellikle hiçbir countparametrenin belirtilmediği zamankiyle aynı . Daha fazla sorun: dddosyayı 16777216 bayta keser, ancak bunun sonunda bir delik oluşturduğunu umuyorsanız, önce delikten sonra veri yazmanız ve daha sonra veri içermeyen bir boyuta kesmeniz gerektiğinden yanılıyorsunuz .
schily

count = 0, count parametresi belirtmek gibi bir şey değildir. Bunun dd if=/dev/zero of=somefileaynı olduğunu mu söylüyorsun dd if=/dev/zero of=somefile count=0? Dene.
PeteC

Elbette! count=0 olduğu tüm bir sayım parametresini belirtmek olmasaydı aynı. Bu, en azından orijinal kaynaklardan türetilen tüm uygulamalar için geçerlidir. Deneyin, asla orijinal ddkomutla çalışmadığınız anlaşılıyor .
schily

count'Bu parametreyi yoksay' anlamında benzersiz bir değer olarak 0 belirten herhangi bir belge bulamıyorum . Bulabilir misin? Böyle bir belge olmadan, count=0'sıfır blok yazma' anlamına gelir ve bundan sapma bir hatadır ... (orijinal kaynaklar veya hayır).
PeteC

1
Bu, yetersiz belirtilen metnin düzeltildiği Mayıs 2015'ten önceki POSIX dokümanlarıydı.
schily

1

Kullanmak zorunda ddmısın? Bir dosyanın belirli (mantıksal) uzunluğa sahip olmasını istiyorsanız, istediğiniz konuma sıfır yazın. Önceki uç ile yazılı bayt arasındaki baytlar, boş bayt olarak görüntülenir. İşte perl kullanan bir örnek.

$ echo Hello > file
$ ls -l file
-rw-r--r-- 1 user group 6 Apr 16 22:59 file
$ perl -le 'open(my $f,"+<","file"); seek($f, 16777216 - 2, 0); print $f "\0"'
$ ls -ln file
-rw-r--r-- 1 user group 16777216 Apr 16 22:59 file

Neden "- 2" satırında? Betik bir bayt yazacaktır, bu yüzden o bayttan önceki pozisyonu aramak için 1 çıkarıyoruz. Diğerini çıkarırız çünkü arama pozisyonu sıfır indekslidir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.