Pada sistem (dan sistem file) yang mendukung SEEK_HOLE
lseek
flag (seperti Ubuntu 12.04 Anda pada ext4 akan) dan dengan asumsi nilai SEEK_HOLE
adalah 4 seperti di Linux:
if perl -le 'seek STDIN,0,4;$p=tell STDIN;
seek STDIN,0,2; exit 1 if $p == tell STDIN'< the-file; then
echo the-file is sparse
else
echo the-file is not sparse
fi
Sintaks shell itu adalah POSIX. Hal-hal non-portabel di dalamnya adalah perl
dan itu SEEK_HOLE
.
lseek(SEEK_HOLE)
mencari ke awal lubang pertama di file, atau akhir file jika tidak ada lubang yang ditemukan. Di atas kita tahu file tidak jarang ketika lseek(SEEK_HOLE)
membawa kita ke akhir file (ke tempat yang sama dengan lseek(SEEK_END)
).
Jika Anda ingin membuat daftar file yang jarang:
find . -type f ! -size 0 -exec perl -le 'for(@ARGV){open(A,"<",$_)or
next;seek A,0,4;$p=tell A;seek A,0,2;print if$p!=tell A;close A}' {} +
GNU find
(sejak versi 4.3.3) harus -printf %S
melaporkan jarangnya file. Dibutuhkan pendekatan yang sama dengan jawaban frostschutz karena dibutuhkan rasio penggunaan disk vs ukuran file, jadi tidak dijamin untuk melaporkan semua file jarang (seperti ketika ada kompresi pada tingkat filesystem atau di mana ruang yang disimpan oleh lubang tidak mengkompensasi overhead infrastruktur sistem file atau atribut diperluas besar), tetapi akan bekerja pada sistem yang tidak memiliki SEEK_HOLE
atau sistem file di mana SEEK_HOLE
tidak diimplementasikan. Di sini dengan alat GNU:
find . -type f ! -size 0 -printf '%S:%p\0' |
awk -v RS='\0' -F : '$1 < 1 {sub(/^[^:]*:/, ""); print}'
(perhatikan bahwa versi sebelumnya dari jawaban ini tidak berfungsi dengan baik ketika find
menyatakan sparseness seperti misalnya 3.2e-05. Terima kasih atas jawaban @ flashydave untuk membawanya ke perhatian saya)