आकार के अनुसार फ़ाइलों को पुनरावर्ती रूप से सॉर्ट करना


78

मुझे एक फ़ोल्डर में सबसे बड़ी फ़ाइलों को खोजने की आवश्यकता है।
मैं पुनरावर्ती रूप से किसी फ़ोल्डर को कैसे स्कैन करूं और सामग्री को आकार से सॉर्ट करूं?

मैंने उपयोग करने की कोशिश की है ls -R -S, लेकिन यह निर्देशिकाओं को भी सूचीबद्ध करता है।
मैंने भी प्रयोग करने की कोशिश की find


1
क्या आप प्रत्येक उपनिर्देशिका में फ़ाइलों को अलग से सूचीबद्ध करना चाहते हैं या क्या आप सभी उपखंडों में सभी फ़ाइलों को खोजना चाहते हैं और चाहे वे जिस भी उपनिवेश में हों, आकार के आधार पर उन्हें सूचीबद्ध करें? इसके अलावा, "निर्देशिका" और "फ़ोल्डर" से आपका क्या मतलब है? आप विभिन्न चीजों का वर्णन करने के लिए उनका उपयोग करते प्रतीत होते हैं।
terdon

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

जवाबों:


92

आप इसे सिर्फ के साथ भी कर सकते हैं du। बस मैं इस संस्करण का उपयोग कर रहा हूं du:

$ du --version
du (GNU coreutils) 8.5

पहुंच:

$ du -ah ..DIR.. | grep -v "/$" | sort -rh

दृष्टिकोण का टूटना

कमांड du -ah DIRदी गई डायरेक्टरी में सभी फाइलों और डायरेक्टरीज़ की एक सूची तैयार करेगी DIR-hमानव पठनीय आकार जो मैं पसंद का उत्पादन करेगा। यदि आप उन्हें नहीं चाहते हैं तो उस स्विच को छोड़ दें। मैं head -6सिर्फ उत्पादन की मात्रा को सीमित करने के लिए उपयोग कर रहा हूँ !

$ du -ah ~/Downloads/ | head -6
4.4M    /home/saml/Downloads/kodak_W820_wireless_frame/W820_W1020_WirelessFrames_exUG_GLB_en.pdf
624K    /home/saml/Downloads/kodak_W820_wireless_frame/easyshare_w820.pdf
4.9M    /home/saml/Downloads/kodak_W820_wireless_frame/W820_W1020WirelessFrameExUG_GLB_en.pdf
9.8M    /home/saml/Downloads/kodak_W820_wireless_frame
8.0K    /home/saml/Downloads/bugs.xls
604K    /home/saml/Downloads/netgear_gs724t/GS7xxT_HIG_5Jan10.pdf

यह सबसे बड़ा करने के लिए सबसे छोटा छाँटने के लिए काफी आसान है:

$ du -ah ~/Downloads/ | sort -h | head -6
0   /home/saml/Downloads/apps_archive/monitoring/nagios/nagios-check_sip-1.3/usr/lib64/nagios/plugins/check_ldaps
0   /home/saml/Downloads/data/elasticsearch/nodes/0/indices/logstash-2013.04.06/0/index/write.lock
0   /home/saml/Downloads/data/elasticsearch/nodes/0/indices/logstash-2013.04.06/0/translog/translog-1365292480753
0   /home/saml/Downloads/data/elasticsearch/nodes/0/indices/logstash-2013.04.06/1/index/write.lock
0   /home/saml/Downloads/data/elasticsearch/nodes/0/indices/logstash-2013.04.06/1/translog/translog-1365292480946
0   /home/saml/Downloads/data/elasticsearch/nodes/0/indices/logstash-2013.04.06/2/index/write.lock

इसका उल्टा करें, सबसे बड़ा सबसे छोटा:

$ du -ah ~/Downloads/ | sort -rh | head -6
10G /home/saml/Downloads/
3.8G    /home/saml/Downloads/audible/audio_books
3.8G    /home/saml/Downloads/audible
2.3G    /home/saml/Downloads/apps_archive
1.5G    /home/saml/Downloads/digital_blasphemy/db1440ppng.zip
1.5G    /home/saml/Downloads/digital_blasphemy

मुझे निर्देशिका न दिखाएं, बस फाइलें:

$ du -ah ~/Downloads/ | grep -v "/$" | sort -rh | head -6 
3.8G    /home/saml/Downloads/audible/audio_books
3.8G    /home/saml/Downloads/audible
2.3G    /home/saml/Downloads/apps_archive
1.5G    /home/saml/Downloads/digital_blasphemy/db1440ppng.zip
1.5G    /home/saml/Downloads/digital_blasphemy
835M    /home/saml/Downloads/apps_archive/cad_cam_cae/salome/Salome-V6_5_0-LGPL-x86_64.run

यदि आप बस सबसे छोटी से सबसे बड़ी सूची चाहते हैं, लेकिन शीर्ष 6 आपत्तिजनक फ़ाइलें आप सॉर्ट स्विच, ड्रॉप ( -r) को उल्टा कर सकते हैं और tail -6इसके बजाय उपयोग कर सकते हैं head -6

$ du -ah ~/Downloads/ | grep -v "/$" | sort -h | tail -6
835M    /home/saml/Downloads/apps_archive/cad_cam_cae/salome/Salome-V6_5_0-LGPL-x86_64.run
1.5G    /home/saml/Downloads/digital_blasphemy
1.5G    /home/saml/Downloads/digital_blasphemy/db1440ppng.zip
2.3G    /home/saml/Downloads/apps_archive
3.8G    /home/saml/Downloads/audible
3.8G    /home/saml/Downloads/audible/audio_books

14
grep -v "/$"भाग कर रही करने के लिए आप क्या उम्मीद नहीं लगता है, के रूप में निर्देशिकाओं एक स्लेश संलग्न नहीं है। क्या कोई जानता है कि कैसे निर्देशिका को परिणामों से बाहर रखा जाए?
Jan Warchoł

@JanekWarchol - कोर्यूटिल्स के किस संस्करण का आप उपयोग कर रहे हैं?
स्लम

मैं 8.13 पर हूं। लेकिन वैसे भी, आपके उत्तर में आउटपुट के पास /या तो अनुगामी नहीं है - उदाहरण के लिए /home/saml/Downloads/audibleएक निर्देशिका लगती है, लेकिन इसमें स्लैश नहीं है। केवल /home/saml/Downloads/एक स्लैश है, लेकिन यह शायद इसलिए है क्योंकि आपने प्रारंभिक के लिए तर्क निर्दिष्ट करते समय इसे स्लैश के साथ लिखा था du
Jan Warchoł

1
यह dirs भी पाता है
ekerner

1
यह सिर्फ फाइलों को सूचीबद्ध नहीं करता है, बल्कि निर्देशिकाओं को भी सूचीबद्ध करता है :(
रोमन गॉफमैन

20

यदि आप वर्तमान निर्देशिका और इसके उप निर्देशिकाओं में सभी फाइलों को खोजना चाहते हैं और उन्हें उनके आकार के अनुसार सूचीबद्ध करना चाहते हैं (उनके पथ पर विचार किए बिना), और यह मानते हुए कि किसी भी फ़ाइल नाम में नई वर्ण नहीं हैं, GNU के साथ find, आप यह कर सकते हैं:

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

से man findएक जीएनयू सिस्टम पर:

   -printf format
          True; print format  on  the  standard  output,
          interpreting  `\'  escapes and `%' directives.
          Field widths and precisions can  be  specified
          as  with the `printf' C function.  Please note
          that many of the  fields  are  printed  as  %s
          rather  than  %d, and this may mean that flags
          don't work as you  might  expect.   This  also
          means  that  the `-' flag does work (it forces
          fields to be  left-aligned).   Unlike  -print,
          -printf  does  not add a newline at the end of
          the string.  The escapes and directives are:

          %p     File's name.
          %s     File's size in bytes.

से man sort:

   -n, --numeric-sort
          compare according to string numerical value

दुर्भाग्य से मैक पर काम नहीं करता है, पता चलता है: खोज: -प्रचार: अज्ञात प्राथमिक या ऑपरेटर
रोमन गॉफमैन

@RomanGaufman हां, यही कारण है कि उत्तर GNU को निर्दिष्ट करता है । यदि आप अपने मैक पर जीएनयू उपकरण स्थापित करते हैं, तो यह वहां भी काम करेगा।
terdon

11

निम्नलिखित कमांड आज़माएं:

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

यह शीर्ष -20 सबसे बड़ी फ़ाइलों को वर्तमान निर्देशिका में पुनरावर्ती रूप से सूचीबद्ध करेगा।

नोट: विकल्प -hके लिए sortतो आप स्थापित करने के लिए है, OSX / बीएसडी पर उपलब्ध नहीं है sortसे coreutils(उदाहरण के लिए के माध्यम से brew) और करने के लिए स्थानीय बिन पथ लागू PATH, जैसे

export PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH" # Add a "gnubin" for coreutils.

वैकल्पिक रूप से उपयोग करें:

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

सबसे बड़ी निर्देशिका के उपयोग के लिए du, उदाहरण के लिए:

du -ah . | sort -rh | head -20

या:

du -a . | sort -rn | head -20

3
बिल्कुल सही, यह पहला समाधान है जो मैक पर काम करता है और निर्देशिका नहीं दिखाता है :) - धन्यवाद!
रोमन गॉफमैन

फ़िल्टर को केवल लाइनों की संख्या के साथ फ़ाइल दिखाने के लिए कैसे> = X? (एक्स = ० छूट के लिए)
मैट्रिक्स

7

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

find . -type f -print0 | xargs -0 ls -la | awk '{print int($5/1000) " KB\t" $9}' | sort -n -r -k1


Ubuntu 14.04 पर भी काम किया!
डेविड लैम

यह निर्देशिकाओं को सूचीबद्ध करता है, न कि केवल फाइलें :(
रोमन गॉफमैन

@RomanGaufman - प्रतिक्रिया के लिए धन्यवाद! मेरे परीक्षणों से, find . -type fफ़ाइलों को ढूँढता है ... यह पुनरावर्ती रूप से काम करता है, आप सही हैं, लेकिन यह उन सभी फ़ाइलों को सूचीबद्ध करता है, जो स्वयं निर्देशिकाओं को नहीं
ब्रैड पार्क्स

1980 के दशक में Xargs का इस्तेमाल किया गया है। यह 1989 के बाद से एक बुरा विचार है जब डेविड कॉर्न द्वारा निष्पादन को पेश किया गया है।
शास्त्री

5

इसके साथ zsh, आपको सबसे बड़ी फ़ाइल मिलेगी (स्पष्ट आकार के रूप में जैसे ls -lआउटपुट में आकार स्तंभ , डिस्क उपयोग नहीं):

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

6 सबसे बड़े लोगों के लिए:

ls -ld -- **/*(DOL[1,6])

फ़ाइल आकार से उन क्रमबद्ध करने के लिए, आप उपयोग कर सकते हैं lsके -Sविकल्प। कुछ lsकार्यान्वयन में सूची को क्रमबद्ध नहीं करने का भी -Uविकल्प होता है ls(जैसा कि यह पहले से ही zshयहाँ आकार के अनुसार क्रमबद्ध है )।


3

मैक / लिनक्स के लिए सरल समाधान जो निर्देशिकाओं को छोड़ देता है:

find . -type f -exec du -h {} \; | sort -h

2

में समतुल्य है BSDया OSXहै

$ du -ah simpl | sort -dr | head -6

0

यह विभिन्न कारणों के लिए एक अविश्वसनीय रूप से कमोन की आवश्यकता है (मुझे एक निर्देशिका में सबसे हालिया बैकअप ढूंढना पसंद है), और एक आश्चर्यजनक सरल कार्य है।

मैं एक लिनक्स समाधान प्रदान करने जा रहा हूं जो कि खोज, xargs, स्टेट, टेल, awk और सॉर्ट उपयोगिताओं का उपयोग करता है।

अधिकांश लोगों ने कुछ अनोखे उत्तर दिए हैं, लेकिन मुझे मेरा पसंद है क्योंकि यह ठीक से फ़ाइल नाम संभालता है, और उपयोग के मामले को आसानी से बदला जा सकता है (स्टेटमेंट को संशोधित करें, और तर्कों को सॉर्ट करें)

मैं एक पायथन समाधान भी प्रदान करूँगा जो आपको विंडोज पर भी इस कार्यक्षमता का उपयोग करने देना चाहिए

लिनक्स कमांड लाइन समाधान

एक निर्देशिका से केवल फ़ाइलों की पूरी सूची को पुन: वापस करें, फ़ाइल आकार द्वारा क्रमबद्ध

find . -type f -print0 | xargs -0 -I{} stat -c '%s %n' {} | sort -n

पहले की तरह ही, लेकिन इस बार, सबसे बड़ी फ़ाइल लौटाएँ।

# Each utility is split on a new line to help 
# visualize the concept of transforming our data in a stream
find . -type f -print0 | 
xargs -0 -I{} stat -c '%s %n' {} | 
sort -n | 
tail -n 1 |
awk '{print $2}'

वही सटीक पैटर्न, लेकिन अब सबसे बड़ी के बजाय नवीनतम फ़ाइल का चयन करें

# (Notice only the first argument of stat changed for new functionality!)
find . -type f -print0 | xargs -0 -I{} stat -c '%Y %n' {} | 
sort -n | tail -n 1 | awk '{print $2}'

स्पष्टीकरण:

  1. खोज: वर्तमान निर्देशिका की सभी फ़ाइलों को पुन: खोजता है, और उन्हें एक अशक्त चरित्र के साथ प्रिंट करता है
  2. xargs: मानक इनपुट से प्रदान किए गए तर्कों का उपयोग करके कमांड निष्पादित करने की उपयोगिता। आउटपुट की हर लाइन के लिए, हम उस फाइल पर स्टेट यूटिलिटी चलाना चाहते हैं
  3. स्टेट: स्टेट एक कमाल की कमांड के चारों ओर है जिसमें बहुत सारे उपयोग के मामले हैं। मैं दो कॉलमों को प्रिंट कर रहा हूं, पहला कॉलम ब्लॉक साइज (% s), और दूसरा कॉलम फाइल नेम (% n)
  4. क्रमबद्ध करें: संख्यात्मक स्विच के साथ परिणामों को क्रमबद्ध करें। चूंकि पहला तर्क पूर्णांक है, इसलिए हमारे परिणाम ठीक से हल हो जाएंगे
  5. पूंछ: केवल आउटपुट की अंतिम पंक्ति का चयन करें (चूंकि सूची को क्रमबद्ध किया गया है, यह सबसे बड़ी फ़ाइल है!)
  6. awk: दूसरा कॉलम चुनें, जिसमें फ़ाइल नाम शामिल है, और एक पुनरावर्ती निर्देशिका में सबसे बड़ी फ़ाइल है।

अजगर का हल

#!/usr/bin/env python
import os, sys
files = list()
for dirpath, dirname, filenames in os.walk(sys.argv[1]):
    for filename in filenames:
        realpath = os.path.join(dirpath, filename)
        files.append(realpath)
files_sorted_by_size = sorted(files, key = lambda x: os.stat(x).st_size)
largest_file = files_sorted_by_size[-1]
print(largest_file)

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



0

नीचे बढ़ते क्रम में फ़ोल्डर्स के साथ क्रमबद्ध विकल्प की कोशिश करें

du -sh * | sort -sh


-1

AIX और HP-UX को छोड़कर किसी भी प्लेटफ़ॉर्म पर काम करने वाला कुछ है:

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