निर्देशिका और उसकी उपनिर्देशिकाओं में सबसे बड़ी फ़ाइल कैसे खोजें?


102

हम सिर्फ UNIX क्लास शुरू कर रहे हैं और कई प्रकार के बैश कमांड सीख रहे हैं। हमारे असाइनमेंट में एक निर्देशिका पर विभिन्न कमांड का प्रदर्शन करना शामिल है जिसमें इसके अंतर्गत कई फ़ोल्डर्स भी हैं।

मुझे पता है कि रूट फ़ोल्डर से सभी नियमित फ़ाइलों की सूची और गणना कैसे की जाती है:

find . -type l | wc -l

लेकिन मैं जानना चाहता हूं कि पूरी निर्देशिका में सबसे बड़ी फाइल खोजने के लिए वहां से कहां जाना है। मैंने एक duआदेश के बारे में कुछ देखा है , लेकिन हमने ऐसा नहीं सीखा है, इसलिए हमने जो चीज़ें सीखी हैं, उनके अनुसार मैंने माना है कि हमें इसे किसी तरह ls -tकमांड से जोड़ने की आवश्यकता है ।

और क्षमा करें अगर मेरा 'लिंगो' सही नहीं है, तो मुझे अभी भी इसकी आदत है!


2
यदि आप किसी कमांड के बारे में जानते हैं, लेकिन यह सुनिश्चित नहीं कर सकते हैं कि इसका उपयोग कैसे करना है, तो manजिस कमांड में आप रुचि रखते हैं, उसके बाद टाइप करने का प्रयास करें । उस कमांड के लिए एक अच्छा मैनुअल प्रविष्टि पॉप जाएगा ( qकमांड लाइन पर वापस जाने के लिए दबाएं )।
टिब्बा

जवाबों:


126

इस लिंक से उद्धरण-

यदि आप किसी विशेष निर्देशिका और उसकी उप-निर्देशिकाओं में शीर्ष 10 सबसे बड़ी फ़ाइलों के नाम (निर्देशिका नहीं) खोजना और प्रिंट करना चाहते हैं

$ find . -printf '%s %p\n'|sort -nr|head

वर्तमान निर्देशिका में खोज को प्रतिबंधित करने के लिए "-maxdepth 1" का उपयोग करें।

$ find . -maxdepth 1 -printf '%s %p\n'|sort -nr|head

और शीर्ष 10 सबसे बड़ी "फाइलों और निर्देशिकाओं" को प्रिंट करने के लिए:

$ du -a . | sort -nr | head

** शीर्ष X सबसे बड़ी फ़ाइलों (उपरोक्त सभी उदाहरणों में) को प्रिंट करने के लिए केवल "सिर" के बजाय "हेड-एन एक्स" का उपयोग करें।


1
"Du -a। | सॉर्ट -nr | हेड" वास्तविक फ़ाइल आकार की तुलना में KB की संख्या को दोगुना क्यों करता है?
xxjjnn

6
आह, आपको 'k' विकल्प जोड़ने की आवश्यकता है या यह 1024 के बजाय 512 बाइट के गुणकों को दिखाता है। du
-ak

2
पहले एक के लिए, आपको मानव पठनीय प्रारूप में आकार कैसे मिलता है?
ब्ल्यू ऑक्ट

@ मैं लूज़ के '%s %p\n'साथ बदलने '%p\n'और |xargs ls -lhअंत में जोड़ने की कोशिश करूँगा
डंकन एक्स सिम्पसन

6
पहला समाधान मेरे लिए ओएस एक्स पर काम नहीं करता था, इसलिए मैंने तीसरे समाधान से निर्देशिकाओं को फ़िल्टर करने के लिए एक त्वरित हैक का उपयोग करके समाप्त किया du -am . | sort -nr | grep '\..*\.' | head:। mमेगाबाइट में प्रदर्शन फ़ाइल आकार के लिए है और इसका उपयोग grepकम से कम दो डॉट्स के साथ शो लाइनों के लिए, पहले में है ./रास्ते में, दूसरी फाइल एक्सटेंशन, जैसे में है .mov
Psmith

63

वर्तमान निर्देशिका और उसकी उपनिर्देशिकाओं में शीर्ष 25 फ़ाइलों को खोजने के लिए:

find . -type f -exec ls -al {} \; | sort -nr -k5 | head -n 25

यह "सॉर्ट -nr -k5" पाइप्ड कमांड के माध्यम से फाइलों के आकार के आधार पर सॉर्ट करके शीर्ष 25 फाइलों को आउटपुट करेगा।

समान लेकिन मानव-पठनीय फ़ाइल आकारों के साथ:

find . -type f -exec ls -alh {} \; | sort -hr -k5 | head -n 25


10
find . -type f | xargs ls -lS | head -n 1

आउटपुट

-rw-r--r--  1 nneonneo  staff  9274991 Apr 11 02:29 ./devel/misc/test.out

यदि आप केवल फ़ाइल नाम चाहते हैं:

find . -type f | xargs ls -1S | head -n 1

यह प्रयोग करने से बचता है awkऔर आप जो भी झंडे चाहते हैं उसका उपयोग करने की अनुमति देता है ls

कैवियट । क्योंकि xargsअधिक लंबी लाइनों के निर्माण से बचने की कोशिश करता है, यह विफल हो सकता है यदि आप इसे एक निर्देशिका पर बहुत lsअधिक फ़ाइलों के साथ चलाते हैं क्योंकि एक से अधिक बार निष्पादित होता है। यह एक अचूक समस्या नहीं है (आप head -n 1प्रत्येक lsआह्वान से आउटपुट एकत्र कर सकते हैं , और ls -Sफिर से चला सकते हैं, जब तक आपके पास एक भी फाइल नहीं है) तब तक लूपिंग होता है, लेकिन यह इस दृष्टिकोण को कुछ हद तक प्रभावित करता है।


मुझे क्षमा करें xargs, मैंने आपको
स्टीव

2
रिक्तियों के साथ संभाल फ़ाइल नाम, उपयोग करने के लिएfind . -type f -print0 | xargs -0 ls -lS | head -n 1
rymo

यह केवल पहले बैच xargsद्वारा निष्पादित की गई सबसे बड़ी फ़ाइलों को ढूंढता है । इसे ठीक करने के लिए छँटाई जोड़ें find . -type f -print0 | xargs -0 ls -lS | sort -rk 5 | head -n 10:। मेरे लिए OSX पर काम किया।
psmith

10

लिनक्स / UNIX / BSD फाइल सिस्टम पर सबसे बड़ी फ़ाइलों / निर्देशिकाओं का पता लगाने के लिए कोई सरल कमांड उपलब्ध नहीं है। हालांकि, तीन आदेशों (पाइपों का उपयोग करके) का संयोजन आप आसानी से सबसे बड़ी फ़ाइलों की सूची पा सकते हैं:

# du -a /var | sort -n -r | head -n 10

यदि आप अधिक मानव पठनीय आउटपुट आज़माना चाहते हैं:

$ cd /path/to/some/var
$ du -hsx * | sort -rh | head -10

कहाँ पे,

  • Var वह निर्देशिका है जिसे आप खोजना चाहते हैं
  • du कमांड -h विकल्प: मानव पठनीय प्रारूप में आकार प्रदर्शित करता है (जैसे, 1K, 234M, 2G)।
  • डु कमांड-एस विकल्प: केवल प्रत्येक तर्क (सारांश) के लिए कुल दिखाएं।
  • du कमांड -x विकल्प: विभिन्न फाइल सिस्टम पर निर्देशिकाओं को छोड़ दें।
  • सॉर्ट कमांड -r विकल्प: तुलना के परिणाम को उल्टा करें।
  • सॉर्ट कमांड -h विकल्प: मानव पठनीय संख्याओं की तुलना करें। यह केवल GNU सॉर्ट विशिष्ट विकल्प है।
  • हेड कमांड -10 OR -n 10 विकल्प: पहले 10 लाइनों को दिखाएं।

मुझे दूसरा कमांड बेहतर है लेकिन ओएक्सएक्स पर, सॉर्ट संस्करण के लिए नो-एच विकल्प स्थापित किया गया है। मैक के लिए होना चाहिए: du -hsx * | सॉर्ट -rn | हेड -10
यान वीआर

1
उस दूसरी कमान को प्यार करना! मैंने जितने लोगों की कोशिश की है, उनमें से सबसे अच्छा - मैं इसे बाद के लिए बचाकर रखूंगा।
CodeMouse92

स्पष्ट रूप से कमांड को विस्तार से समझाता है +1
हरीश

8

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

find . -type f -ls | sort +7 | head -1

पहला विकल्प findपुनरावर्ती खोज के लिए प्रारंभ पथ है। fसामान्य फ़ाइलों के लिए खोजों का टाइप । ध्यान दें कि यदि आप इसे एक फ़ाइल नाम के रूप में पार्स करने का प्रयास करते हैं, तो आप विफल हो सकते हैं यदि फ़ाइल नाम में रिक्त स्थान, newlines या अन्य विशेष वर्ण हैं। sortऑपरेटिंग सिस्टम के विकल्प भी भिन्न होते हैं। मैं FreeBSD का उपयोग कर रहा हूं।

एक "बेहतर" लेकिन अधिक जटिल और भारी समाधान findनिर्देशिकाओं को पार करना होगा , लेकिन शायद statफ़ाइल के बारे में विवरण प्राप्त करने के लिए उपयोग करें, फिर शायद awkसबसे बड़ा आकार खोजने के लिए उपयोग करें। ध्यान दें कि आउटपुट statभी आपके ऑपरेटिंग सिस्टम पर निर्भर करता है।


1
+7आर्ग करने का मतलब क्या है ? मेरी मशीन की तरह बस शिकायत है कि यह एक फ़ाइल नामक नहीं मिल सकता है +7
टिब्बा

@Dunes - जैसा कि मैंने कहा, sortआपके सिस्टम के लिए मैन पेज की जाँच करें । मैं इस समय OS X 10.4 का उपयोग कर रहा हूं, जहां उपयोग FreeBSD के सॉर्ट से प्राप्त होता है : sort [-cmus] [-t separator] [-o output-file] [-T tempdir] [-bdfiMnr] [+POS1 [-POS2]] [-k POS1[,POS2]] [file...]... नोट +POS [-POS2]। यह FreeBSD के वर्तमान संस्करणों में भी काम करता है।
धोती

2
लगता है कि तुम मेरे लिए एक अलग तरह का कार्यक्रम है। यह मेरे सॉर्ट प्रोग्राम के लिए मैन पेज है - linux.die.net/man/1/sort इसके लिए मेरी मशीन पर काम करने के लिए आपको स्पष्ट रूप से -karg जैसे का उपयोग करने की आवश्यकता होगी । sort -k 7। संपादित करें: OSX 10.5 द्वारा सॉर्ट के लिए मैन पेज मुझे लगता है कि संस्करण में बदल गया है।
टिब्बा

1
@Dunes - यह सभी GNU सॉर्ट है, लेकिन विभिन्न संस्करण। [+POS1] [-POS2]अंकन सिर्फ एक पुराने एक है। जहां तक ​​मैं बता सकता हूं, यह संकेतन अभी भी आधुनिक जीएनयू सॉर्ट द्वारा समर्थित है, हालांकि अब जब मैं देखता हूं, तो लगता है कि इसे लगभग 5.1 संस्करण के बाद सॉर्ट मैन पेज से हटा दिया गया है। आप इसे FreeBSD 4.11 के लिए मैन पेज में देख सकते हैं । मुझे लगता है कि मैंने FreeBSD 5.0 ​​जारी होने से पहले सॉर्ट का मैन पेज नहीं पढ़ा है!
ghoti

इसके अलावा, ध्यान दें कि +POS1शून्य से सॉर्ट पैरामीटर गिना जाता है, जबकि -k POS1एक से गिना जाता है।
घटिया

6

यह आपकी वर्तमान कार्यशील निर्देशिका में सबसे बड़ी फ़ाइल या फ़ोल्डर मिलेगा:

ls -S /path/to/folder | head -1

सभी उप-निर्देशिकाओं में सबसे बड़ी फ़ाइल खोजने के लिए:

find /path/to/folder -type f -exec ls -s {} \; | sort -nr | awk 'NR==1 { $1=""; sub(/^ /, ""); print }'

मुझे लगता है कि ls का डिफ़ॉल्ट व्यवहार कॉलमों में फाइलों को सूचीबद्ध करना है (यानी प्रति पंक्ति में कई प्रविष्टियाँ), इसलिए पहली बार केवल सबसे बड़ी फ़ाइल नहीं मिलती है। आपके दूसरे आदेश के संबंध में, यह केवल दी गई निर्देशिका में सबसे बड़ी फ़ाइल मिली और इसके उपनिर्देशिका नहीं।
टिब्बा

@Dunes: आप सही हैं, पहला कमांड निर्देशिकाओं को ढूंढ सकता है , लेकिन डिफ़ॉल्ट व्यवहार के कारण नहीं ls। मेरे परीक्षण में, -Sध्वज प्रति पंक्ति एक फ़ाइल सूचीबद्ध करेगा। मैंने दूसरी कमांड को ठीक किया है। उम्मीद है कि अब यह फुलप्रूफ है। धन्यवाद।
स्टीव

4

सोलारिस पर मैं उपयोग करता हूं:

find . -type f -ls|sort -nr -k7|awk 'NR==1{print $7,$11}' #formatted

या

find . -type f -ls | sort -nrk7 | head -1 #unformatted

क्योंकि यहाँ पोस्ट की गई कोई भी चीज़ काम नहीं करती थी। यह सबसे बड़ी फ़ाइल इन $PWDऔर सबडायरेक्ट्रीज़ को खोजेगा।


2

निम्नलिखित वन-लाइनर आज़माएँ (प्रदर्शन शीर्ष -20 सबसे बड़ी फ़ाइलें):

ls -1Rs | sed -e "s/^ *//" | grep "^[0-9]" | sort -nr | head -n20

या (मानव पठनीय आकार):

ls -1Rhs | sed -e "s/^ *//" | grep "^[0-9]" | sort -hr | head -n20

अन्य उत्तरों की तुलना में लिनक्स / बीएसडी / ओएसएक्स के तहत ठीक काम करता है, क्योंकि -printfओएसएक्स / बीएसडी पर खोज का विकल्प मौजूद नहीं है और statओएस के आधार पर अलग-अलग पैरामीटर हैं। हालांकि OSX / BSD पर ठीक से काम करने के लिए दूसरा आदेश (के रूप में sortनहीं है -h), स्थापित sortसे coreutilsया निकालें -hसे lsऔर प्रयोग sort -nrके बजाय।

तो ये एलियास आपकी आरसी फाइलों में होना उपयोगी हैं :

alias big='du -ah . | sort -rh | head -20'
alias big-files='ls -1Rhs | sed -e "s/^ *//" | grep "^[0-9]" | sort -hr | head -n20'

यह केवल पथ के बिना फ़ाइल नाम दिखाता है, इसलिए वास्तव में वास्तव में सबसे बड़ी फ़ाइल खोजने में मदद नहीं करता है।
psmith

मेरे लिए शीर्ष पर मेरे पास वास्तव में सबसे बड़ी फाइलें हैं, लेकिन अंत में यह मुझे सही फाइलें नहीं देता है
बोरिसलाव मार्कोव

2

निम्नलिखित आदेश का प्रयास करें:

find /your/path -printf "%k %p\n" | sort -g -k 1,1 | awk '{if($1 > 500000) print $1/1024 "MB" " " $2 }' |tail -n 1 

यह सबसे बड़ी फ़ाइल नाम और आकार और 500M से अधिक प्रिंट करेगा। आप इसे स्थानांतरित कर सकते हैं if($1 > 500000), और यह निर्देशिका में सबसे बड़ी फ़ाइल प्रिंट करेगा।



0

यह स्क्रिप्ट आगे की कार्रवाई के लिए सबसे बड़ी फाइलें ढूंढने को आसान बनाती है। मैं इसे अपने ~ / बिन निर्देशिका में रखता हूँ, और ~ $ / को अपने PATH में रखता हूँ।

#!/usr/bin/env bash
# scriptname: above
# author: Jonathan D. Lettvin, 201401220235

# This finds files of size >= $1 (format ${count}[K|M|G|T], default 10G)
# using a reliable version-independent bash hash to relax find's -size syntax.
# Specifying size using 'T' for Terabytes is supported.
# Output size has units (K|M|G|T) in the left hand output column.

# Example:
#   ubuntu12.04$ above 1T
#   128T /proc/core

# http://stackoverflow.com/questions/1494178/how-to-define-hash-tables-in-bash
# Inspiration for hasch: thanks Adam Katz, Oct 18 2012 00:39
function hasch() { local hasch=`echo "$1" | cksum`; echo "${hasch//[!0-9]}"; }
function usage() { echo "Usage: $0 [{count}{k|K|m|M|g|G|t|T}"; exit 1; }
function arg1() {
    # Translate single arg (if present) into format usable by find.
    count=10; units=G;  # Default find -size argument to 10G.
    size=${count}${units}
    if [ -n "$1" ]; then
        for P in TT tT GG gG MM mM Kk kk; do xlat[`hasch ${P:0:1}`]="${P:1:1}"; done
        units=${xlat[`hasch ${1:(-1)}`]}; count=${1:0:(-1)}
        test -n "$units" || usage
        test -x $(echo "$count" | sed s/[0-9]//g) || usage
        if [ "$units" == "T" ]; then units="G"; let count=$count*1024; fi
        size=${count}${units}
    fi
}
function main() {
    sudo \
        find / -type f -size +$size -exec ls -lh {} \; 2>/dev/null | \
        awk '{ N=$5; fn=$9; for(i=10;i<=NF;i++){fn=fn" "$i};print N " " fn }'
}

arg1 $1
main $size

0

यह करने के लिए काफी सरल तरीका है:

ls -l | tr -s " " " " | cut -d " " -f 5,9 | sort -n -r | head -n 1***

और आप इसे प्राप्त करेंगे: 8445 examples.desktop


1***अंत में क्या करना चाहिए? मुझे उस तर्क के लिए "कोई मिलान नहीं मिला" त्रुटि मिलती है।
user4815162342

0

लिनक्स सॉल्यूशन: उदाहरण के लिए, आप फ़ाइल / फ़ोल्डर आकार ( अवरोही क्रम ) के अनुसार अपने घर की सभी फाइलों / फ़ोल्डर सूची (/) निर्देशिका को देखना चाहते हैं ।

सूदो डु -xm / | सॉर्ट -rn | अधिक


0

किसी फ़ोल्डर में बड़ी फ़ाइल को सूचीबद्ध करने के लिए

ls -sh /pathFolder | sort -rh | head -n 1

का आउटपुट फ़ाइल आकार संख्या ls -shका एक आकार sऔर मानव hसमझने योग्य दृश्य है।

आप उपयोग कर सकते हैं ls -shS /pathFolder | head -n 1। बड़ी Sसे बड़ी lsसूची पहले से ही बड़ी फाइलों से लेकर छोटे तक की सूची तैयार करती है, लेकिन इसके परिणामस्वरूप उस फ़ोल्डर में सभी फाइलों का योग होता है। इसलिए यदि आप केवल बड़ी फ़ाइल, एक फ़ाइल को सूचीबद्ध करना चाहते हैं, तो आपको head -n 2"दूसरी पंक्ति के परिणाम" की जांच करनी होगी या पहले उदाहरण का उपयोग करना होगा ls sort head


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