सिस्टम पर (और फ़ाइल सिस्टम) SEEK_HOLE
lseek
झंडे का समर्थन करना (जैसे आपके Ubuntu 12.04 ext4 पर) और मान SEEK_HOLE
लेना 4 के लिए है क्योंकि यह लिनक्स पर है:
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
वह शेल सिंटैक्स POSIX है। इसमें गैर-पोर्टेबल सामान हैं perl
और वह है SEEK_HOLE
।
lseek(SEEK_HOLE)
फ़ाइल में पहला छेद शुरू करने का प्रयास करता है , या कोई छेद नहीं मिलने पर फ़ाइल का अंत। ऊपर हम जानते हैं कि फ़ाइल विरल नहीं है जब lseek(SEEK_HOLE)
हमें फ़ाइल के अंत में ले जाता है (जैसे ही उसी स्थान पर lseek(SEEK_END)
)।
यदि आप विरल फ़ाइलों को सूचीबद्ध करना चाहते हैं:
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
(संस्करण 4.3.3 के बाद से) को किसी फ़ाइल -printf %S
की विरलता की रिपोर्ट करनी होती है। यह फ्रॉस्ट्सचुट्ज़ के उत्तर के समान दृष्टिकोण लेता है, जिसमें यह डिस्क उपयोग बनाम फ़ाइल आकार का अनुपात लेता है, इसलिए सभी विरल फ़ाइलों की रिपोर्ट करने की गारंटी नहीं है (जैसे कि जब फ़ाइल सिस्टम स्तर पर संपीड़न होता है या जहां छेद द्वारा बचाया गया स्थान नहीं होता है फाइलसिस्टम इंफ्रास्ट्रक्चर के लिए क्षतिपूर्ति ओवरहेड या बड़ी विस्तारित विशेषताओं), लेकिन उन प्रणालियों पर काम करेगा जिनके पास SEEK_HOLE
या फाइल सिस्टम SEEK_HOLE
नहीं है जहां लागू नहीं किया गया है। यहाँ GNU टूल्स के साथ:
find . -type f ! -size 0 -printf '%S:%p\0' |
awk -v RS='\0' -F : '$1 < 1 {sub(/^[^:]*:/, ""); print}'
(ध्यान दें कि इस उत्तर के पहले संस्करण ने ठीक से काम नहीं किया था जब find
उदाहरण 3.2e-05 के रूप में विरलता व्यक्त की थी। मेरे ध्यान में लाने के लिए @ फ्लैशिडेव के उत्तर के लिए धन्यवाद )