Wiem, że kopiowanie lub przesyłanie tego, co pierwotnie było rzadkie, bez użycia narzędzia, które rozumie rzadkie pliki, spowoduje wypełnienie „dziur”. Czy istnieje metoda lub narzędzie, które pozwala zamienić to, co kiedyś było rzadkim plikiem, na rzadkie?
Na przykład:
utwórz rzadki plik:
% 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
Czy jest jakiś sposób na:
% 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
files
utilities
sparse-files
użytkownik25849
źródło
źródło
rsync -aS
.Odpowiedzi:
Edytuj 2015
od wersji ut-linux 2.25
fallocate
narzędzie w Linuksie ma do tego opcję-d
/--dig-hole
.Wykopałby dziurę dla każdego bloku pełnego zer w pliku
W starszych systemach możesz to zrobić ręcznie:
Linux ma taką
FALLOC_FL_PUNCH_HOLE
opcjęfallocate
. Znalazłem skrypt na githubie z przykładem:Używanie FALLOC_FL_PUNCH_HOLE z Python
Zmodyfikowałem go trochę, aby zrobić to, o co prosiłeś - dziurawić dziury w obszarach plików wypełnionych zerami. Oto on:
Używanie FALLOC_FL_PUNCH_HOLE z Pythona do wybijania dziur w plikach
Przykład:
Zauważ, że
punch.py
wyszukuje tylko bloki 4096 bajtów do wybicia, więc może nie tworzyć pliku tak rzadkiego, jak w momencie uruchamiania. Oczywiście może być mądrzejszy. Ponadto jest tylko lekko przetestowany , więc bądź ostrożny i wykonaj kopie zapasowe, zanim mu zaufasz!źródło
Jeśli chcesz zmniejszyć rozmiar pliku, możesz to zrobić bezpośrednio za pomocą
dd
.Z
dd(1)
instrukcji:Zauważ, że będzie szukał tylko wtedy, gdy cały blok będzie pusty. Dla maksymalnego wykorzystania rzadkości
bs=1
.źródło
bs=512
naprawdę nie ma sensu, ponieważ dyski są urządzeniami blokowymi. (bs=4096
w nowszych dyskach)cp --sparse=always zeropadded.iso isnowsparse.iso
Krótko mówiąc -
tar
podbicie go-S
flagą (przy założeniu tar GNU) i ponowne wykonaniescp
... nie. Żadne narzędzie, o którym wiem, nie wiedziałoby, gdzie są „dziury”.źródło
Miałem z tym szczęście:
Te
-I
siły rsync, aby zaktualizować wszystkie pliki, niezależnie od tego, czy myśli, że się zmieniłem, czy też nie;-S
powoduje, że nowe pliki do sparsified.-a
sprawia, że dzieje się to rekurencyjnie, dzięki czemu można sparsyfikować całe drzewa katalogów za pomocą jednego polecenia.To nie jest tak dobre, jak narzędzie na zamówienie, które wyszukuje dziury i niszczy je
FALLOC_FL_PUNCH_HOLE
, ale lepiej niż duplikować całe drzewa katalogów.źródło