सबसे बड़ी फ़ाइल को पुनरावर्ती रूप से खोजना


41

मैं एक निर्देशिका में सबसे बड़ी फ़ाइल को पुनरावर्ती रूप से खोजने का प्रयास कर रहा हूं। यदि उस निर्देशिका के अंदर एक उपनिर्देशिका है, तो फ़ंक्शन को उस निर्देशिका के अंदर जाने की जरूरत है और यह देखने के लिए जांचें कि क्या सबसे बड़ी फ़ाइल है। एक बार सबसे बड़ी फ़ाइल मिलने के बाद आउटपुट को संबंधित पथ नाम और सबसे बड़ी फ़ाइल के नाम और आकार के साथ प्रदर्शित किया जाता है।

पूर्व:

dude@shell2 (~...assignment/solutions) % bash maxfile.sh ~/test
class/asn
dude.h.gch: 9481628

यह वही है जो मेरे पास है:

#!/bin/sh
clear

recursiveS() {
    for d in *; do
        if [ -d $d ]; then
            (cd $d; echo $(pwd)/$line; du -a; recursiveS;)
        fi
    done
}
recursiveS

मैं अब कुछ समय के लिए अटक गया। मैं इसे कई मौजूदा यूनिक्स टूल को पाइपलाइन करके लागू नहीं कर सकता। कोई भी विचार अच्छा होगा!



केवल उपनिर्देशिका में जाने के लिए: for d in */ .[^.]*/; do ... `
ओलिवियर दुलक

जवाबों:


54

फ़ाइल आकार के साथ फ़ाइल नामों को आउटपुट करने के लिए find(यहाँ GNU मानकर find) उपयोग करें । छांटते हैं। सबसे बड़ा प्रिंट आउट लें।

find . -type f -printf "%s\t%p\n" | sort -n | tail -1

फ़ाइल पथों में newline वर्ण नहीं होते हैं।


bashGNU कार्यान्वयन के साथ एक लूप का उपयोग करना stat:

shopt -s globstar
max_s=0
for f in **; do
  if [[ -f "$f" && ! -L "$f" ]]; then
    size=$( stat -c %s -- "$f" )
    if (( size > max_s )); then
      max_s=$size
      max_f=$f
    fi
  fi
done
echo "$max_s $max_f"

यह समाधान खोजने की तुलना में काफी धीमा होगा। वह यह भी मानता है कि फ़ाइल नाम नईलाइन वर्णों में समाप्त नहीं होते हैं और छिपी हुई फ़ाइलों को छोड़ देंगे और छिपे निर्देशिकाओं में नहीं उतरेंगे।

यदि -वर्तमान निर्देशिका में एक फ़ाइल कहा जाता है, तो स्टड पर खुली हुई फ़ाइल के आकार पर विचार किया जाएगा।

bash४.३ से पहले के संस्करणों से सावधान रहें, जब डायरेक्टरी ट्री उतरते हुए प्रतीकात्मक लिंक का पालन करें।


धन्यवाद, यह काम करता है! मैं मदद की सराहना करता हूं। मैं शेल में प्रोग्रामिंग का उपयोग करने की कोशिश कर रहा हूं। मुझे अभी पूरी तरह से पता नहीं है इसलिए मैं आपको यह बताने की सराहना करता हूं कि कोड की उस लाइन के साथ क्या हो रहा है।
user2419571

त्वरित प्रश्न: जिज्ञासा से बाहर पाइपिंग कमांड के बिना इसे करने का एक तरीका है? मैं उत्सुक हूं क्योंकि मैंने जो भी उदाहरण देखा है उसमें किसी न किसी तरह की पाइपिंग का इस्तेमाल किया गया है।
user2419571

2
मुझे यकीन है कि इसे करने के अन्य तरीके हैं। UNIX दर्शन यह है कि उपकरण एकल-उद्देश्य होने चाहिए, और उन्हें एक साथ श्रृंखला करने के लिए ताकि एक कमांड का आउटपुट अगले के इनपुट में खिलाया जा सके।
ग्लेन जैकमैन

यह समझ आता है। आपकी मदद के लिए पुनः शुक्रिया।
user2419571 20

2
@ user2419571 tail -n 1 <(sort -n <(find . -type f -printf "%s\t%p\n")):;)
साइरस


5

यह BSD / macOS पर काम करता है:

find . -type f -ls | sort -k7 -r

आप | head -n 3दिलचस्प प्रविष्टियों (इस मामले में 3) का अंक प्रदर्शित करने के लिए भी अपील कर सकते हैं ।


1
यह कैसे काम करता है यह समझाकर इस उत्तर को बेहतर बनाया जा सकता है। इसके अलावा, यह स्वीकृत उत्तर के समान है (जो पूरी तरह से यह नहीं बताता है कि यह कैसे काम करता है)।
ढग

man findऔर man sort, ब्रेनज़ :-) का उपयोग करें
CeDeROM

वास्तव में MacOS पर काम नहीं कर रहा है क्योंकि यह आकार को सही ढंग से वापस करने में विफल रहता है और बड़ी संख्या में कॉलम लौटाता है।
सोरिन

3

साथ zsh, सबसे बड़ी नियमित रूप से फ़ाइल के लिए:

ls -ld -- **/*(.DOL[1])

(निश्चित रूप से आप ls -ld --किसी भी कमांड से बदल सकते हैं । यदि जीएनयू lsया संगत का उपयोग करके मानव पठनीय आकारों के-h लिए भी विकल्प देखें )

  • .: केवल नियमित फाइलें (निर्देशिका नहीं, सहानुभूति, उपकरण, पंद्रह ...)
  • D: छिपे हुए लोगों को शामिल करें और छिपे हुए डेरों में उतरें
  • OL: आकार ( Lउत्कीर्ण) द्वारा रिवर्स-ऑर्डर किया गया ।
  • [1]: केवल पहला मैच।

यदि संबंध हैं, तो आप उनमें से किसी एक को यादृच्छिक रूप से प्राप्त करेंगे। यदि आप वर्णमाला क्रम में पहला चाहते हैं, तो वर्णानुक्रम से संबंधों को क्रमबद्ध करने के लिए एक अतिरिक्त on( ame oद्वारा rder n) जोड़ें ।

ध्यान दें कि यह फ़ाइलों के आकार पर विचार करता है, डिस्क उपयोग पर नहीं।


... मुझे विश्वास है कि आप zsh के पेरोल पर हैं;) (जो यह बहुत अच्छी तरह से हो सकता है?)। zsh दुर्भाग्य से सभी प्रणालियों पर उपलब्ध नहीं है ...
ओलिवियर

पहली दस फाइलें प्राप्त करना संभव है? (एक पाश की तरह कुछ बेवकूफ किए बिना)
Wowfunhappy

1
@Wowfunhappy के [1]साथ[1,10]
स्टीफन Chazelas
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.