Menggunakan rsync --link-dest
untuk snapshot hemat-ruang , bagaimana saya bisa mengetahui berapa banyak ruang yang sebenarnya saya simpan? Atau lebih umum:
Bagaimana cara mengetahui berapa banyak ruang yang digunakan direktori dengan mempertimbangkan hanya file yang tidak di-hardlink di tempat lain di luar struktur direktori? Ditanyakan secara berbeda: Berapa banyak ruang yang benar-benar akan dibebaskan setelah penghapusan direktori itu? (
du -hs
akan berbohong. Ruang yang dibutuhkan untuk hardlink sendiri mungkin termasuk)
disk-usage
hard-link
Tobias Kienzler
sumber
sumber
du
hanya menghitung ukuran file satu kali bahkan jika mereka terhubung keras kecuali Anda menggunakan opsi-l
/--count-links
. Anda menjalankandu
seluruh pohon dua kali, dengan dan tanpa opsi itu dan perbedaan antara ukuran harus berapa banyak ruang yang Anda simpan di semua direktori.Jawaban:
Dengan asumsi tidak ada hardlink internal (yaitu, setiap file dengan lebih dari 1 hardlink ditautkan dari luar pohon), Anda dapat melakukannya:
EDIT Dan inilah yang saya sketsa di komentar, diterapkan. Hanya tanpa
du
; kudos to @StephaneChazelas untuk memperhatikandu
tidak perlu. Penjelasan di akhir.Apa yang kami lakukan adalah membuat string dengan penggunaan disk (dalam KB) dari setiap file yang relevan, dipisahkan dengan tanda plus. Lalu kami memberi makan tambahan besar itu
bc
.find
Doa pertama melakukannya untuk direktori.find
Cetakan kedua menghitung jumlah penghitungan, inode, dan penggunaan disk. Kami melewati daftar itusort | uniq -c
untuk mendapatkan daftar (jumlah tampilan di pohon, jumlah tautan, inode, penggunaan disk).Kami melewati bahwa daftar melalui
awk
, dan, jika field pertama (# dari penampilan) lebih besar dari atau sama kedua (# dari hardlinks), yang berarti tidak ada link ke file ini dari luar pohon, kemudian mencetak lapangan keempat ( penggunaan disk) dengan tanda plus dan garis miring terbalik.Akhirnya kita menghasilkan a
0
, jadi rumusnya secara sintaksis benar (itu akan menjadi+
sebaliknya) dan meneruskannya kebc
. Fiuh.(Tapi saya akan menggunakan metode pertama yang lebih sederhana, jika itu memberikan jawaban yang cukup baik.)
sumber
find
untuk mencetak daftar semua file dengan inode dan jumlah tautannya; lalu beberapa kombinasisort | uniq -c
untuk mendapatkan berapa kali setiap inode muncul di pohon, lalu saring yang dengan jumlah tautan lebih besar dari jumlah penampilan ... dan kemudian masukkan daftar itu kedu
. Tetapi jika persyaratannya terpenuhi, lebih baik selamatkan usahanya.du
ada-d
parameter yang mirip denganls
...btrfs
sistem file, jumlah tautan untuk direktori selalu1
, jadi Anda perlu menambahkan! -type d
Pada dasarnya, Anda perlu mendapatkan nomor inode dan jumlah tautan untuk semua file (non-direktori), bandingkan jumlah tautan dengan jumlah kemunculan setiap inode, dan jika berbeda, kecualikan file tersebut.
Dengan asumsi, mereka semua berada di sistem file yang sama, sesuatu seperti ini seharusnya bekerja (dengan GNU find):
sumber
%k
dilaporkan. Itu hebat,du
tidak diperlukan sama sekali! Saya akan memperbarui jawaban saya ketika saya pulang. Terima kasih!du
sebenarnya tidak akan berbohong;) Ini mem-parsing dir (s) yang diberikannya, menghitung hanya yang pertama dari semua hardlink yang menunjuk ke inode yang sama yang dihadapinya.Jika Anda bertanya
du
apa yang dilihatnya dalam satu direktori saja, itu tidak peduli bahwa ada tautan keras lain yang menunjuk ke konten yang sama:Sekarang berikan dirs pada baris yang sama (dimulai dengan yang terbaru untuk rsync incremental backups with
--link-dest
):Atau seluruh dir cadangan:
File apa pun di 'daily.1' yang merujuk pada inode (alias file "asli") yang telah dirujuk dalam 'daily.0' tidak akan dihitung.
Karena itu menghapus setiap hari.1 akan menghemat 364MB di perangkat Anda.
MENGHAPUS
sumber