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


27

मैं '20MB से अधिक वर्तमान निर्देशिका में शीर्ष 10 सबसे हाल की फ़ाइलों की सूची' समस्या को हल करना चाहता हूं।

साथ lsमैं कर सकते हैं:

ls -Shal |head

शीर्ष 10 सबसे बड़ी फाइलें प्राप्त करने के लिए, और:

ls -halt |head

शीर्ष 10 सबसे हाल की फ़ाइलों को प्राप्त करने के लिए

खोजने के साथ मैं कर सकता हूँ:

find . -size +20M

वर्तमान निर्देशिका में 20MB से अधिक की सभी फ़ाइलों को सूचीबद्ध करने के लिए (और उपनिर्देशिकाएँ, जो मुझे नहीं चाहिए)।

क्या किसी निश्चित आकार में, हाल ही में उपयोग की गई शीर्ष दस सबसे हाल की फाइलों को सूचीबद्ध करने का कोई तरीका है ls?

जवाबों:


24

के लिए 'वर्तमान निर्देशिका' विकल्प findहै -maxdepth 1। आपकी आवश्यकताओं के लिए पूरी कमांडलाइन है:

find . -maxdepth 1 -type f -size +20M -print0 | xargs -0 ls -Shal | head

या

find . -maxdepth 1 -type f -size +20M -print0 | xargs -0 ls -halt | head

8

नोट: यह GNU-find के लिए काम करेगा, लेकिन हर दूसरे खोजने में नहीं।

find . -maxdepth 1 -size +20M -printf "%T@ %f\n" | 
    sort -nr | head -n 20 | sed 's/[^ ]\+ //'

@Rajish की तरह शुरू करना, लेकिन आउटपुट फॉर्मेट को निर्दिष्ट करने के लिए printfकमांड का उपयोग करना find। इसमें 3 समय-संबंधी प्रारूपों, कर रहे हैं atime, ctime और mtime - %Tmtime के लिए किया जाता है, %Aऔर %Cअन्य प्रारूपों के लिए कर रहे हैं।

@युग के बाद से सेकंड में timeformat निर्दिष्ट करने के लिए है। %fफ़ाइल नाम के लिए, \n2 फ़ाइलों के बीच एक नई रेखा के लिए है।

फिर उल्टे क्रम में संख्या द्वारा छंटनी सबसे पहले सबसे युवा फाइलें देती है, और हम 20 पंक्तियों के साथ लेते हैं head

अंत में, sedसमय की जानकारी को दूर फेंकने के लिए उपयोग किया जाता है।

¹) चूंकि headलाइन से लाइन काम करती है, नाम में 20 से अधिक newlines के साथ एक एकल फ़ाइल, जो थोड़ा असामान्य है, लेकिन निषिद्ध नहीं है, यह पहले 20 मैचों से संबंधित होने पर आउटपुट को भ्रष्ट कर सकता है। यदि आपके पास ऐसी फाइलें हैं, तो कृपया उनका नाम बदलने के लिए - उनसे छुटकारा पाने की कोशिश करें। वे अक्सर सरल स्क्रिप्ट के लिए एक समस्या होगी।


1
आप का उपयोग करते हैं fileके -lsआदेश, विशेष वर्ण बैकस्लैश-एस्केप्ड पात्रों के रूप में प्रिंट किया जाएगा: find . -maxdepth 1 -size +20M -printf "%T@ " -ls | sort -nr | head -n 20 | sed 's/[^ ]\+ //'। इसके अतिरिक्त प्रारूप जैसा दिखेगा ls -l, -lवैसे भी EoghanM निर्दिष्ट होगा ।
मैनावर्क

printfकेवल विशिष्ट GNU वितरण के लिए काम करता है।
ब्रेथोसॉज़

%T+मानव पठनीय टाइमस्टैम्प को उत्पन्न करता है जैसे 2018-11-06+13:37:54.4606466460कि sort(बिना -n) के भी छांटे जाते
Ciro Santilli 新疆 tim tim tim 事件 事件

5

Zsh के ग्लोब क्वालिफायर इसे आसान बनाते हैं। .क्वालीफायर चयन केवल नियमित रूप से फ़ाइलें, Lm+20चयन फ़ाइलें कि कम से कम 20 MB के साथ साथ एक बाइट लंबा पर कर रहे हैं; उन फ़ाइलों को शामिल करने के लिए जो बिल्कुल 20MB लंबी हैं, उपयोग करें L+20971519। फिर omसंशोधन का समय घटाकर, और [1,10]पहले 10 मैचों के विस्तार को प्रतिबंधित करता है। यदि आप फ़ाइलों को दिनांक के अनुसार सूचीबद्ध करना चाहते हैं, तब भी आपको -tविकल्प की आवश्यकता है ls; या आप फ़ाइलों को किसी अन्य कमांड (सबसे पहले युवा) को पास कर सकते हैं। सबसे पुरानी फाइल के साथ दूसरी कमांड में फाइल को पास करने के लिए, Omसंशोधन के समय को बढ़ाकर और [-10,-1]पिछले 10 मैचों को निकालने के लिए उपयोग करें।

ls -ltr -- *(.Lm+20om[1,10])
echo *(.Lm+20Om[-10,-1])

2

मुझे लगता है कि यह समस्या को हल करने का एक बेहतर तरीका हो सकता है ...

find . -maxdepth 1 -type f -size +20M -exec ls -Shal {} \+ | head

किसी भी त्रुटि से छुटकारा पाने के लिए, उन फ़ाइलों तक पहुँचने का प्रयास करें जिन्हें आपको पढ़ने की अनुमति नहीं है जिन्हें आप जोड़ना चाह सकते हैं

find . -maxdepth 1 -type f -size +20M -exec ls -Shal {} \+ 2> /dev/null | head 

1

यह केवल निर्दिष्ट 10 फ़ाइलों को मुद्रित करेगा, चाहे फ़ाइल नामों में कोई भी एम्बेडेड newline वर्ण की परवाह किए बिना। यह फाइल सिस्टम का उपयोग करता हैinodes

cd "$1"
for i in $(find . -maxdepth 1 -type f -size +20M -printf "%T@\t%i\n" \ 
           | sort -nr | head | cut -f 2)
do
  ls -l "$(find . -inum $i)"
done

-1

सारे सवालों के जवाब देने के लिए धन्यवाद। जो मैं गया हूं वह निम्नलिखित है:

ls -halt | grep "M " |head

हालाँकि यह 20 मेगाबाइट्स को मेगाबाइट (और एक गीगाबाइट के नीचे) के पक्ष में किसी भी चीज़ के पक्ष में माफ़ करता है, यह फाइलों के मानव पठनीय तत्व को याद रखना और संरक्षित करना आसान है।


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

यह सच है कि मुझे यकीन है, लेकिन एक मानव उपयोगकर्ता (और आउटपुट को कहीं और पाइप नहीं किया जा रहा है) के संदर्भ में, यह याद रखना आसान है क्योंकि इसे ज्ञात सरल टूल tldp.org/LDP/GNU-Linux-
इघनम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.