फ़ाइल सूची वाले फ़ाइल से कुल फ़ाइल आकार प्राप्त करें


14

मेरे पास एक फाइल है जिसमें फ़ाइलों की एक सूची है जिसे मैं कुल फ़ाइलों का आकार जानना चाहूंगा। क्या ऐसा करने की आज्ञा है?

मेरा OS एक बहुत ही बुनियादी लाइनक्स (Qnap TS-410) है।

संपादित करें:

फ़ाइल से कुछ पंक्तियाँ:

/ शेयर / संग्रह / बेली टेस्ट / BD006 / 0.tga
/ शेयर / संग्रह / बेली / BD007 / 1 संस्करण 1.tga
/ शेयर / संग्रह / बेली 2 / BD007 / example.tga


हमें फ़ाइल की कुछ उदाहरण लाइनें दें।
EEAA

जोड़ी गई फ़ाइल से उदाहरण।
निकोलस

यह किसी प्रकार का NAS है, है ना? क्या आपके पास बिजीबॉक्स स्थापित है?
cjc

हाँ यह है और मुझे लगता है कि यह पहले से ही स्थापित है, क्यों?
निकोलस

जवाबों:


13

मेरा मानना ​​है कि कुछ इस तरह व्यस्तता में काम करेगा:

du `cat filelist.txt` | awk '{i+=$1} END {print i}'

मेरे पास आपके जैसा वातावरण नहीं है, लेकिन यदि आप फ़ाइल नाम में रिक्त स्थान के साथ कुछ इस तरह से सामना करते हैं तो यह भी काम करेगा:

cat filelist.txt | while read file;do
  du "$file"
done | awk '{i+=$1} END {print i}'

संपादित करें 1 :
@stew नीचे अपनी पोस्ट में सही है, डु डिस्क उपयोग दिखाता है न कि सटीक फाइलें। व्यवहार को बदलने के लिए बिजीबॉक्स -a ध्वज का उपयोग करता है, इसलिए प्रयास करें: du -a "$file"सटीक फ़ाइलों के लिए और आउटपुट / व्यवहार की तुलना करें।


1
आपके इनपुट के लिए धन्यवाद, पहला कमांड रिटर्न /usr/bin/du: Argument list too long(मेरी फाइल में लगभग 80,000 लाइनें)। आप दूसरी कमांड बस मुझे एक संकेत देता है एक बार जब मैं प्रवेश करता हूं, तो कुछ और इंतजार कर रहा हूं?
निकोलस

अपने पर्यावरण के साथ कहना मुश्किल है। क्या यह सामान्य कमांड प्रॉम्प्ट है, या सिर्फ ब्लिंकिंग प्रॉम्प्ट है? यदि इसका उत्तरार्द्ध यह धीमी गति से परिणाम के लिए इंतजार कर रहा हो सकता है, अगर इसका "इनपुट प्रॉम्प्ट" हो सकता है तो यह हो सकता है कि आप कुछ चरित्र से चूक गए हों? और अगर इसका सामान्य संकेत मुझे पता नहीं है, तो मैंने इसे टाइप करने से पहले काफी परीक्षण किया। :(
मटियास अहेनबर्ग

जब मैं निम्नलिखित कार्य करता हूं तो यह "इनपुट प्रॉम्प्ट" होता है cat tgafiles.txt | while read file;do du "$file" done | awk '{i+=$1} END {print i}'। धन्यवाद मैटियास
निकोलस

1
आह! यदि आप एक लाइन पर सब कुछ डालते हैं तो आपको दूसरे की आवश्यकता होती है; इस तरह: cat tgafiles.txt | while read file;do du "$file";done | awk '{i+=$1} END {print i}'(यानी करने से पहले)।
मटियास अहेनबर्ग

सटीक! यह पूरी तरह से काम किया, चीयर्स! (हालाँकि मैं खुद इस गलती का पता लगा सकता था)
निकोलस

8
du -c `cat filelist.txt` | tail -1 | cut -f 1

-cलाइन "कुल आकार" जोड़ता है;
tail -1अंतिम पंक्ति लेता है (कुल आकार के साथ);
cut -f 1"कुल" शब्द काट दिया।


यह डु-तर्क सूची के साथ बहुत लंबा है। मेरा फिल्मकार बड़ा है। Xargs के साथ नीचे दिए गए जवाब सबसे आसान समाधान लगता है।
साइक्लोन 0044

4

मैं नहीं जानता कि क्या आपके लिनक्स उपकरण इसके लिए सक्षम हैं, लेकिन:

cat /tmp/filelist.txt  |xargs -d \\n du -c

करो, ज़ार परिसीमन को एक नया चरित्र बना देगा, और डू आपके लिए एक भव्य कुल का उत्पादन करेगा।

Http://busybox.net/downloads/BusyBox.html को देखकर ऐसा लगता है कि "बिजीबॉक्स डू" ग्रैंड टोटल ऑप्शन को सपोर्ट करेगा, लेकिन "बिजीबॉक्स xargs" कस्टम डेलीमीटर को सपोर्ट नहीं करेगा।

फिर से, मुझे आपके टूलसेट का यकीन नहीं है।


यहाँ परिणाम है:xargs: invalid option -- d
निकोलस

बहुत बढ़िया: NAS के बिजी बॉक्स लाइनक्स के साथ काम करना मैकग्यूवर एपिसोड की तरह है, जो कुछ कैनवस, स्टिक्स और सुतली से काम करने वाले हवाई जहाज बनाने की कोशिश कर रहा है।
cjc

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

1
मुझे लगता है कि उत्तर सबसे अच्छा है। यह संक्षिप्त है, और इस धागे में अन्य उत्तरों की तुलना में बहुत तेज है।
ज़िम्मान

अच्छा उत्तर। आप यह जानना छोड़ सकते हैं कि यदि फ़ारिस्ट बहुत लंबा है, तो कई योगों का निर्माण -cकरने के लिए xargs कई कॉल करेगा । dudu
क्यूर

4
while read filename ;  do stat -c '%s' $filename ; done < filelist.txt | awk '{total+=$1} END {print total}'

यह मैटियस आहर्नबर्ग के समाधान के समान है। रिक्त स्थान के साथ फ़ाइलनाम / निर्देशिकाओं के साथ "रीड" का उपयोग करने से समस्याओं का सामना करना पड़ता है। मैं फाइल प्राप्त करने के statबजाय उपयोग करता हूं du। du को उस कमरे की मात्रा मिल रही है, जो फाइल के बजाय डिस्क पर उपयोग कर रहा है, जो भिन्न हो सकता है। आपके फाइल सिस्टम के आधार पर, एक 1 बाइट फ़ाइल अभी भी डिस्क पर 4k (या जो भी अवरोधक है) पर कब्जा करेगी। तो 1 बाइट फ़ाइल के लिए, स्टेट 1 बाइट और डु 4k कहता है।


फाइल के बारे में अच्छी टिप्पणी
मटियास अहेनबर्ग

बहुत दिलचस्प टिप्पणी वास्तव में, दुर्भाग्य से मेरे लिनक्स को statकमांड नहीं पता है :stat: command not found
निकोलस

आपको "बिजीबॉक्स स्टेट" कहना पड़ सकता है।
cjc

stat: applet not foundइस मामले में यह कहता है
निकोलस

4

यहाँ समस्या का एक और समाधान है:

cat filelist.txt | tr '\n' '\0' | wc -c --files0-from=-

मेरे लिए (सागविन पर) du -bcबहुत तेज दौड़ता है।
क्यूर

2

कुछ इस तरह की कोशिश करो:

$ cat filelist.txt | xargs ls -l | awk '{x+=$5} END {print "total bytes: " x}' 

रास्तों में रिक्त स्थान से निपटने के लिए:

$ find /path/to/files -type f -print0 | xargs -0 ls -l | awk '{x+=$5} END {print "total bytes: " x}' 

आपके इनपुट के लिए धन्यवाद, दुर्भाग्य से मुझे लगता है कि निर्देशिका में रिक्त स्थान के साथ एक मुद्दा है मेरी फ़ाइल में "\" के साथ भाग नहीं जा रहा है, इसलिए फ़ाइल सूची से गुजरते समय यह टूट जाता है।
निकोलस

क्या आप पाठ फ़ाइल सूची को बायपास कर सकते हैं, और बस इसे बंद कर सकते हैं find?
ईएएए

दुर्भाग्य से सूची बहुत लंबी है, इसमें 79159 फाइलें (पूर्ण पथ) की लाइनें हैं, यही कारण है कि मैं इसे एक फाइल पर आउटपुट करता हूं; शायद मैं खोज के परिणाम से बचने के बारे में एक तर्क जोड़ सकता हूं?
निकोलस

मेरे लिनक्स सिस्टम पर खोज के साथ कोई "-प्रिंट0" तर्क नहीं है
निकोलस

@ निकोलस - यह findवास्तविक findबाइनरी के बजाय व्यस्त बॉक्स के स्ट्रिप-डाउन का उपयोग करने के कारण है ।
EEAA

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