Orijinal olarak seyrek ve sonra genişletilmiş bir dosya tekrar seyrek yapılabilir mi?


29

Seyrek dosyaların doldurulmasının ya da seyredilmesinin “seyrek” dosyalara neden olacağına dair bir yardımcı program kullanmadan kopyalanmasının ya da aktarılmasının asıl olarak seyrek bir dosya olduğunu biliyorum. Bir zamanlar seyrek bir dosyanın seyrek seyredip dönmediğini gösteren bir yöntem ya da yardımcı program var mı?

Örneğin:
seyrek dosya oluşturun:

% dd if=/dev/zero of=TEST bs=1 count=0 seek=1G
# do some op that pads out the holes
% scp TEST localhost:~/TEST2
% ls -lhs TEST*
   0 -rw-rw-r--. 1 tony tony 1.0G Oct 16 13:35 TEST
1.1G -rw-rw-r--. 1 tony tony 1.0G Oct 16 13:37 TEST2

Bir yolu var mı:

% resparse TEST2
to get:
   0 -rw-rw-r--. 1 tony tony 1.0G Oct 16 13:35 TEST
  0G -rw-rw-r--. 1 tony tony 1.0G Oct 16 13:37 TEST2

Üzgünüm, orjinal
sorguları düzeltmek

1
Bunu gördüğüm her şeyi yapabilen tek şey bir GNU 'cp', '% cp --sparse =' de olduğu gibi her zaman eski-seyrek dosya yeni-seyrek-dosya 'Detractor bunu yapmaz' yerinde'.
user25849, 16:12

Seyrek bir dosyayı kopyalamak ve kopyasının seyrek olmasını istiyorsanız, kullanın rsync -aS.
Gilles 'SO- kötü olmaktan vazgeç'

Yanıtlar:


30

2015'i Düzenle

util-linux 2.25'ten itibaren, fallocateLinux'taki yardımcı program bunun için bir -d/ --dig-holeseçeneğe sahiptir.

fallocate -d the-file

Dosyadaki sıfırlarla dolu her blok için bir delik kazardım


Eski sistemlerde, el ile yapabilirsiniz:

Linux'un bunu yapabilmesi FALLOC_FL_PUNCH_HOLEiçin bir seçeneği var fallocate. Bir örnek ile github'da bir script buldum:

Python'dan FALLOC_FL_PUNCH_HOLE kullanarak

İstediğiniz şeyi yapmak için biraz değişiklik yaptım - sıfırlarla dolu dosyaların bölgelerine delik açın. İşte burada:

Dosyalarda delik açmak için Python'dan FALLOC_FL_PUNCH_HOLE kullanımı

usage: punch.py [-h] [-v VERBOSE] FILE [FILE ...]

Punch out the empty areas in a file, making it sparse

positional arguments:
  FILE                  file(s) to modify in-place

optional arguments:
  -h, --help            show this help message and exit
  -v VERBOSE, --verbose VERBOSE
                        be verbose

Örnek:

# create a file with some data, a hole, and some more data
$ dd if=/dev/urandom of=test1 bs=4096 count=1 seek=0
$ dd if=/dev/urandom of=test1 bs=4096 count=1 seek=2

# see that it has holes
$ du --block-size=1 --apparent-size test1
12288   test1
$ du --block-size=1 test1
8192    test1

# copy it, ignoring the hole
$ cat test1 > test2
$ du --block-size=1 --apparent-size test2
12288   test2
$ du --block-size=1 test2
12288    test2

# punch holes again
$ ./punch.py test2
$ du --block-size=1 --apparent-size test2
12288   test2
$ du --block-size=1 test2
8192    test2

# verify
$ cmp test1 test2 && echo "files are the same"
files are the same

punch.pySadece 4096 baytlık blokları dışarı çıkartacağını unutmayın , bu nedenle bir dosyayı başlattığınız zamanki kadar seyrek yapamayabilir. Elbette daha akıllı hale getirilebilir. Ayrıca, sadece hafifçe test edilmiştir , bu yüzden güvenmeden önce dikkatli olun ve yedekleyin !


1
Bunu en çok seviyorum, çünkü tüm dosyayı tekrar yazmayı gerektirmiyor.
Peter,

8

Bir dosyayı seyrek yapmak istiyorsanız, bunu doğrudan ile yapabilirsiniz dd.

dd if=./zeropadded.iso of=./isnowsparse.iso conv=sparse

Gönderen dd(1)manuel:

          sparse   If one or more output blocks would consist solely of
                   NUL bytes, try to seek the output file by the required
                   space instead of filling them with NULs, resulting in a
                   sparse file.

Bu nedenle, yalnızca tüm blok boşsa ileriye bakacağını unutmayın. Az miktarda seyrek kullanım için bs=1.


2
bs=512Disk blok aygıtları olduğundan blok ebadı gerçekten küçük bir anlam ifade etmiyor. ( bs=4096daha yeni sürücülerde)
lapo

Bu eşdeğer görünüyorcp --sparse=always zeropadded.iso isnowsparse.iso
maxschlepzig 26:16

2

Kısa tarbir ile o kadar -ing -Sbayrağı (GNU tar varsayarak) ve yeniden yürütme scphayır .... Farkında olduğum hiçbir yardımcı program "deliklerin" nerede olduğunu bilmenin bir yolunu bulamazdı.


5
GNU cp bir dosyayı yeniden ayrıştırır: Man sayfasından: Specure --sparse = her zaman SOURCE dosyası yeterince uzun bir sıfır bayt dizisi içerdiğinde her zaman seyrek bir DEST dosyası oluşturmak için.
user25849, 16:12

Muhteşem. Her gün bir şeyler öğrenin - bu bayrak ne zaman tanıtıldı? Arada sırada "iyi bilinen" programların man sayfalarını okumak için öder; D
tink

2

Bu konuda iyi şanslar oldu:

cd whatever
rsync -avxWSHAXI . .

-IGüçler olursa olsun değişmiş veya olmasın sanıyor bakılmaksızın, tüm dosyaları güncellemek için rsync; bunun -Snedeni yeni dosyaların seyrekleşmesine neden olur. -aözyinelemeli bir hale getirir, böylece tüm dizin ağaçlarını tek bir komutta sıralayabilirsiniz.

Delik avlayan ve onları yok eden ısmarlama bir araç kadar iyi değildir FALLOC_FL_PUNCH_HOLE, ancak tüm dizin ağaçlarını çoğaltmak zorunda kalmaktan iyidir.

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.