मैं किसी bash स्क्रिप्ट में फ़ाइल का आकार कैसे प्राप्त कर सकता हूं?


246

मैं किसी bash स्क्रिप्ट में फ़ाइल का आकार कैसे प्राप्त कर सकता हूं?

मैं इसे कैसे एक bash वैरिएबल को असाइन कर सकता हूं ताकि मैं इसे बाद में उपयोग कर सकूं?


stackoverflow.com/questions/5920333/how-to-check-size-of-a-file LOL माइग्रेट करने के लिए :-)
Ciro Santilli 新疆 est est 六四

1
इस के साथ जोड़ी pvऔर catएक कॉपी कमांड के लिए जो प्रगति और ईटीए दिखाती है :)
sudo

stat -c% s file.name
neverMind9

जवाबों:


242

ग्नू प्रणाली पर आपका सबसे अच्छा दांव:

stat --printf="%s" file.any

से आदमी स्टेट :

% s कुल आकार, बाइट्स में

एक बाश स्क्रिप्ट में:

#!/bin/bash
FILENAME=/home/heiko/dummy/packages.txt
FILESIZE=$(stat -c%s "$FILENAME")
echo "Size of $FILENAME = $FILESIZE bytes."

नोट: मैक ओएस एक्स पर टर्मिनल में स्टैटिन का उपयोग करने के लिए @ chbrown का उत्तर देखें


7
@ haunted85 statसबसे सीधा तरीका है, यह मानते हुए कि आप लिनक्स या साइगविन ( statमानक नहीं है) का उपयोग कर रहे हैं । wc -cजैसा कि यूजेन ने बताया कि यह पोर्टेबल है।
गिल्स

2

stat --printf="%s" file.txtडेबियन जेसी पर कुछ भी उत्पादन नहीं करता ...
woohoo

5
MacOS पर यह काम करता है:stat -f%z myfile.tar
ccpizza

2
@woohoo आपका प्रॉम्प्ट आउटपुट को ओवरराइट कर देता है। man statका कहना है कि --printf पीछे नई रूपरेखा को छोड़ देता है। आउटपुट का उपयोग करें --formatया -cदेखें। तुलना stat --printf="%s" file.any | xxd -करने के लिए अधिक जानकारी प्राप्त करेंstat -c "%s" file.any | xxd -
पोते

92
file_size_kb=`du -k "$filename" | cut -f1`

उपयोग करने statमें समस्या यह है कि यह एक GNU (Linux) एक्सटेंशन है। du -kऔर cut -f1POSIX द्वारा निर्दिष्ट हैं और इसलिए किसी भी यूनिक्स प्रणाली के लिए पोर्टेबल हैं।

उदाहरण के लिए, सोलिस, बैश वाले जहाज लेकिन साथ नहीं stat। तो यह पूरी तरह से काल्पनिक नहीं है।

lsइसमें एक समान समस्या है कि आउटपुट का सटीक प्रारूप निर्दिष्ट नहीं किया गया है, इसलिए इसके आउटपुट को पार्स करने पर इसे आंशिक रूप से नहीं किया जा सकता है। du -hएक GNU एक्सटेंशन भी है।

जहाँ संभव हो, पोर्टेबल निर्माण से चिपके रहें और आप भविष्य में किसी का जीवन आसान बना देंगे। शायद अपना।


48
duफ़ाइल का आकार नहीं देता है, यह इस बात का संकेत देता है कि फ़ाइल कितनी जगह का उपयोग करती है, जो सूक्ष्म रूप से भिन्न है (आमतौर पर रिपोर्ट किया duगया आकार फ़ाइल के आकार को निकटतम ब्लॉक की संख्या तक होता है, जहां एक ब्लॉक होता है आम तौर पर 512B या 1kB या 4kB) होता है।
गिल्स

7
@ गिल्स, विरल फाइलें (यानी, उनमें छेद वाले) लंबाई से कम रिपोर्ट करते हैं।
वॉनब्रांड

5
इसके साथ --bytesया -bइसके बजाय -k, स्वीकृत उत्तर होना चाहिए।
अमेडी वैन गैससे

1
-h( "मानव") का विकल्पdu : सामान्य मामलों के लिए सबसे उपयुक्त जवाब का उत्पादन करेगा file_size=`du -h "$filename" | cut -f1के रूप में यह कश्मीर (किलोबाइट), एम (मेगाबाइट) या जी (गीगाबाइट) उचित रूप में प्रदर्शित करेगा,।
फ्रालाउ

1
@fralau: ओपी "इसे बैश वैरिएबल को असाइन करना चाहता है ताकि वे इसे बाद में उपयोग कर सकें", इसलिए यह बहुत अधिक संभावना है कि वे एक वास्तविक संख्यात्मक मान चाहते हैं, न कि मानव-पठनीय सन्निकटन। इसके अलावा, -hएक GNU एक्सटेंशन है; यह मानक
निमो

72

आप "शब्द गणना" कमांड का उपयोग भी कर सकते हैं ( wc):

wc -c "$filename" | awk '{print $1}'

इसके साथ समस्या wcयह है कि यह फ़ाइल नाम जोड़ देगा और आउटपुट को इंडेंट कर देगा। उदाहरण के लिए:

$ wc -c somefile.txt
    1160 somefile.txt

यदि आप किसी फ़ाइल आकार की गणना प्राप्त करने के लिए पूरी तरह से व्याख्या की गई भाषा या स्ट्रीम संपादक का पीछा करने से बचना चाहते हैं, तो फ़ाइल से इनपुट को पुनर्निर्देशित करें ताकि फ़ाइल wcनाम कभी न देखें:

wc -c < "$filename"

इस अंतिम रूप को कमांड प्रतिस्थापन के साथ इस्तेमाल किया जा सकता है ताकि आप आसानी से शेल चर के रूप में मांग कर सकें, जैसा कि नीचे गिलेज़ द्वारा बताया गया है ।

size="$(wc -c <"$filename")"

30
wc -c <"$FILENAME"इस प्रकार कोई अन्य cruft के साथ आकार देता है size=$(wc -c <"$FILENAME")
गिल्स

6
बस एक और बिंदु: मैंने अभी इसका परीक्षण किया है और यह wc -c < fileबहुत तेज़ प्रतीत होता है, कम से कम ओएस एक्स पर। मैं अनुमान लगा रहा हूं कि wc में केवल -c निर्दिष्ट होने पर फ़ाइल को स्टेट करने की कोशिश करने का दिमाग है।
एडवर्ड फॉक

4
@EdwardFalk: GNU wc -cका उपयोग करता है fstat, लेकिन फिर फ़ाइल के दूसरे-अंतिम ब्लॉक की तलाश करता है और अंतिम अप-टू- st_blksizeबाइट पढ़ता है । जाहिरा तौर पर ऐसा इसलिए है क्योंकि लिनक्स में फाइलें /procऔर /sysउदाहरण के लिए स्टेट्स साइज हैं जो केवल अनुमानित हैं , और wcवास्तविक आकार की रिपोर्ट करना चाहते हैं, न कि स्टेट-रिपोर्टेड साइज। मुझे लगता है कि इसकी wc -cतुलना में एक अलग आकार की रिपोर्ट करना अजीब होगा wc, लेकिन अगर यह सामान्य डिस्क फ़ाइल है, तो फ़ाइल से डेटा पढ़ने के लिए विचार नहीं है, और यह स्मृति में नहीं है। या इससे भी बदतर, पास-लाइन टेप भंडारण ...
पीटर कॉर्ड्स

1
ऐसा लगता है जैसे printfअभी भी इंडेंटेशन देखता है, जैसे printf "Size: $size"-> size: <4 spaces> 54339। दूसरी ओर echoव्हॉट्सएप को नजरअंदाज करता है। इसे सुसंगत बनाने का कोई तरीका?
यूजीन कुलबुहोव

2
@keithpjolley: कॉल करके fstat। दौड़ने की कोशिश करें strace wc -c </etc/passwdऔर आप देख सकते हैं कि यह क्या कर रहा है।
नेमो

48

बीएसडी (मैक ओएस एक्स) statमें एक अलग प्रारूप तर्क ध्वज है, और विभिन्न क्षेत्र विनिर्देशक हैं। से man stat(1):

  • -f format: निर्दिष्ट प्रारूप का उपयोग करके जानकारी प्रदर्शित करें। मान्य स्वरूपों के विवरण के लिए FORMATS अनुभाग देखें।
  • ... प्रारूप अनुभाग ...
  • z: बाइट्स में फ़ाइल का आकार।

तो अब सब एक साथ:

stat -f%z myfile1.txt

28

निर्भर करता है कि आपको आकार से क्या मतलब है ।

size=$(wc -c < "$file")

आपको उस बाइट की संख्या देगा जो फ़ाइल से पढ़ी जा सकती है। IOW, यह फ़ाइल की सामग्री का आकार है। हालाँकि यह फ़ाइल की सामग्री को पढ़ेगा (सिवाय इसके कि फ़ाइल एक नियमित फ़ाइल है या सिमिलिंक के रूप में अधिकांश wcकार्यान्वयन में नियमित फ़ाइल के लिए सिमलिंक है )। जिसके दुष्प्रभाव हो सकते हैं। उदाहरण के लिए, एक नामित पाइप के लिए, जो पढ़ा गया है उसे अब फिर से नहीं पढ़ा जा सकता है और जैसी चीजों के लिए /dev/zeroया /dev/randomजो अनंत आकार के हैं, इसमें कुछ समय लगने वाला है। इसका मतलब यह भी है कि आपको readफ़ाइल की अनुमति चाहिए , और फ़ाइल के अंतिम एक्सेस टाइमस्टैम्प को अपडेट किया जा सकता है।

यह मानक और पोर्टेबल है, हालांकि ध्यान दें कि कुछ wcकार्यान्वयन में उस आउटपुट में अग्रणी रिक्त स्थान शामिल हो सकते हैं। इनसे छुटकारा पाने का एक तरीका यह है:

size=$(($(wc -c < "$file")))

या किसी खाली अंकगणित की अभिव्यक्ति के बारे में एक त्रुटि से बचने के लिए dashया yashजब wcकोई आउटपुट उत्पन्न न हो (जैसे कि फ़ाइल को खोला नहीं जा सकता):

size=$(($(wc -c < "$file") +0))

ksh93है wcbuiltin (बशर्ते आप इसे सक्षम, आप भी यह के रूप में आह्वान कर सकते हैं command /opt/ast/bin/wc), जो यह सबसे कि खोल में नियमित रूप से फ़ाइलों के लिए सक्षम बनाता है।

विभिन्न प्रणालियों में एक कमांड होती है, जिसे statइंटरफ़ेस stat()या lstat()सिस्टम कॉल कहा जाता है ।

वे रिपोर्ट जो इनोड में पाई गई हैं। उस जानकारी में से एक st_sizeविशेषता है। नियमित फ़ाइलों के लिए, यह सामग्री का आकार है (त्रुटि के अभाव में इससे कितना डेटा पढ़ा जा सकता है (यही wc -cउनके अनुकूलन में सबसे अधिक कार्यान्वयन का उपयोग करता है)। सीमलिंक के लिए, वह लक्ष्य पथ के बाइट्स में आकार है। सिस्टम के आधार पर नामित पाइपों के लिए, यह या तो 0 है या पाइप बफर में वर्तमान में बाइट्स की संख्या है। ब्लॉक डिवाइस के लिए समान जहां सिस्टम पर निर्भर करता है, आपको अंतर्निहित भंडारण के बाइट्स में 0 या आकार मिलता है।

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

कालानुक्रमिक क्रम से:

  • IRIXstat (90):

    stat -qLs -- "$file"

    ( ) या: st_sizeका गुण लौटाता है$filelstat()

    stat -s -- "$file"

    सिवाय $fileसिम्लिंक के सिवाय कब किस मामले में यह st_sizeसिमलिंक रेजोल्यूशन के बाद फाइल का है।

  • zsh statमॉड्यूल zstatमें निर्मित (जिसे अब भी जाना जाता है ) zsh/stat(साथ लोड zmodload zsh/stat) (1997):

    stat -L +size -- $file # st_size of file
    stat +size -- $file    # after symlink resolution
    

    या एक चर में स्टोर करने के लिए:

    stat -L -A size +size -- $file

    जाहिर है, यह उस शेल में सबसे कुशल है।

  • जीएनयूstat (2001); stat2005 के बाद से बिजीबॉक्स में भी (GNU से कॉपी किया गया stat):

    stat -c %s -- "$file"  # st_size of file
    stat -Lc %s -- "$file" # after symlink resolution
    

    (ध्यान दें कि -LIRIX की तुलना में इसका उल्टा अर्थ है या zsh stat

  • बीएसडीstat (2002):

    stat -f %z -- "$file"  # st_size of file
    stat -Lf %z -- "$file" # after symlink resolution
    

या आप कुछ स्क्रिप्टिंग भाषा के stat()/ lstat()फ़ंक्शन का उपयोग कर सकते हैं जैसे perl:

perl -le 'print((lstat shift)[7])' -- "$file"

AIX में एक istatकमांड भी है जो सभी को डंप करेगा stat()(नहीं lstat(), इसलिए सिम्बलिंक्स पर काम नहीं करेगा) जानकारी और जिसे आप पोस्ट-प्रोसेस कर सकते हैं, उदाहरण के लिए:

LC_ALL=C istat "$file" | awk 'NR == 4 {print $5}'

( विवरण का पता लगाने में मदद के लिए धन्यवाद @JeffSchaller )।

इन tcsh:

@ size = -Z $file:q

(साइमलिंक रिज़ॉल्यूशन के बाद आकार)

जीएनयू ने अपनी statकमान पेश करने से बहुत पहले , जीएनयू findकमांड के साथ इसकी -printfभविष्यवाणी (1991 में पहले से ही) हासिल की थी:

find -- "$file" -prune -printf '%s\n'    # st_size of file
find -L -- "$file" -prune -printf '%s\n' # after symlink resolution

एक मुद्दा यह है कि अगर काम नहीं करता है $fileके साथ शुरू होता -है या एक है findविधेय (जैसे !, (...)।

stat()/ lstat()जानकारी प्राप्त करने के लिए मानक कमांड है ls

POSIXly, आप कर सकते हैं:

LC_ALL=C ls -dn -- "$file" | awk '{print $5; exit}'

और -Lसिमलिंक रिज़ॉल्यूशन के बाद उसी के लिए जोड़ें । यह डिवाइस फ़ाइलों के लिए काम नहीं करता है, जहां 5 वें क्षेत्र आकार के बजाय डिवाइस प्रमुख संख्या है।

ब्लॉक डिवाइस के लिए, सिस्टम जहां stat()0 के लिए रिटर्न st_sizeहोता है, आमतौर पर ब्लॉक डिवाइस के आकार की रिपोर्ट करने के लिए अन्य एपीआई होते हैं। उदाहरण के लिए, लिनक्स के पास BLKGETSIZE64 ioctl()सबसे अधिक लिनक्स वितरण अब एक blockdevकमांड के साथ जहाज है जो इसका उपयोग कर सकता है:

blockdev --getsize64 -- "$device_file"

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

lsblk -bdno size -- "$device_file"

खाली उपकरणों को छोड़कर काम करना चाहिए।

एक दृष्टिकोण जो सभी खोज योग्य फ़ाइलों के लिए काम करता है (जिसमें नियमित रूप से फ़ाइलें, अधिकांश ब्लॉक डिवाइस और कुछ चरित्र डिवाइस शामिल हैं) फ़ाइल को खोलना और अंत की तलाश करना है:

  • मॉड्यूल zshलोड करने के साथ (बाद में zsh/system):

    {sysseek -w end 0 && size=$((systell(0)))} < $file
  • के साथ ksh93:

    < "$file" <#((size=EOF))

    या

    { size=$(<#((EOF))); } < "$file"
  • साथ perl:

    perl -le 'seek STDIN, 0, 2 or die "seek: $!"; print tell STDIN' < "$file"

नामित पाइप के लिए, हम देखा है कि कुछ सिस्टम (AIX, Salaris, एचपी / UX कम से कम) डेटा की मात्रा पाइप में उपलब्ध बफर में बनाने stat()की st_size। कुछ (जैसे लिनक्स या फ्रीबीएसडी) नहीं।

कम से कम लिनक्स पर, आप FIONREAD ioctl()पाइप को खोलने के बाद उपयोग कर सकते हैं (इसे लटकने से बचाने के लिए रीड + राइट मोड में)

fuser -s -- "$fifo_file" && 
  perl -le 'require "sys/ioctl.ph";
            ioctl(STDIN, &FIONREAD, $n) or die$!;
            print unpack "L", $n' <> "$fifo_file"

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

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

इसके द्वारा लौटाया गया एक और इनकोड विशेषता stat()है st_blocks। यह 512 बाइट ब्लॉक की संख्या है जो फ़ाइल के डेटा (और कभी-कभी इसके कुछ मेटाडेटा जैसे कि लिनक्स पर ext4 फाइल सिस्टम पर विस्तारित विशेषताओं की तरह) को संग्रहीत करने के लिए उपयोग किया जाता है। यह इनकोड को खुद में शामिल नहीं करता है, या निर्देशिका में प्रविष्टियाँ फ़ाइल से जुड़ी हुई हैं।

आकार और डिस्क का उपयोग अनिवार्य रूप से संपीड़न, स्पार्सनेस (कभी-कभी कुछ मेटाडेटा) के रूप में कसकर संबंधित नहीं होता है, कुछ फाइल सिस्टम में अप्रत्यक्ष ब्लॉक जैसे अतिरिक्त बुनियादी ढांचे का उत्तरार्द्ध पर प्रभाव पड़ता है।

यह आमतौर पर duडिस्क उपयोग की रिपोर्ट करने के लिए क्या उपयोग करता है। ऊपर सूचीबद्ध अधिकांश कमांड आपको वह जानकारी प्राप्त करने में सक्षम होंगे।

  • POSIXLY_CORRECT=1 ls -sd -- "$file" | awk '{print $1; exit}'
  • POSIXLY_CORRECT=1 du -s -- "$file" (निर्देशिकाओं के लिए नहीं जहाँ यह फ़ाइलों के डिस्क उपयोग को शामिल करेगा)।
  • जीएनयू find -- "$file" -printf '%b\n'
  • zstat -L +block -- $file
  • जीएनयू stat -c %b -- "$file"
  • बीएसडी stat -f %b -- "$file"
  • perl -le 'print((lstat shift)[12])' -- "$file"

स्पष्ट रूप से सबसे व्यापक और सूचनात्मक उत्तर। धन्यवाद। मैं BSD और GNU आँकड़े जानकारी का उपयोग करके क्रॉस प्लेटफ़ॉर्म बैश स्क्रिप्ट बनाने के लिए इसका उपयोग कर सकता
हूं

1
मजेदार तथ्य: GNU कोरुटिल्स wc -cका उपयोग करता है fstat, लेकिन फिर अंतिम अप-टू- st_blksizeबाइट्स पढ़ता है । जाहिर तौर पर ऐसा इसलिए है क्योंकि लिनक्स में फाइलें /procऔर /sysउदाहरण के लिए स्टैट साइज हैं जो केवल अनुमानित हैं । यह शुद्धता के लिए अच्छा है, लेकिन खराब है अगर फ़ाइल का अंत डिस्क पर है और मेमोरी में नहीं है (esp। यदि एक लूप में कई फ़ाइलों पर उपयोग किया जाता है)। और बहुत बुरा है अगर फ़ाइल नियर-लाइन टेप भंडारण के लिए माइग्रेट की जाती है , या उदाहरण के लिए एक FUSE पारदर्शी-अपघटन फ़ाइल सिस्टम।
पीटर कॉर्ड्स

यह काम भी नहींls -go file | awk '{print $3}'
स्टीवन पेनी

@StevenPenny वे -goSysV वाले होंगे, वे BSDs ( PIXIX में वैकल्पिक (XSI)) पर काम नहीं करेंगे। आपको भी ls -god file | awk '{print $3; exit}'( -dइसके लिए निर्देशिकाओं पर काम करना होगा, exitलक्ष्य में newlines के साथ सहानुभूति के लिए)। डिवाइस फ़ाइलों के साथ समस्याएं भी बनी हुई हैं।
स्टीफन चेज़लस

1
@ α makessнιη यूनिक्स एपीआई पाठ और बाइनरी फ़ाइलों के बीच कोई अंतर नहीं करता है। यह बाइट्स के सभी सीक्वेंस हैं। कुछ एप्लिकेशन टेक्स्ट के रूप में उन बाइट्स की व्याख्या करना चाहते हैं, लेकिन स्पष्ट रूप wc -cसे बाइट्स की संख्या की रिपोर्ट नहीं करते हैं।
स्टीफन चेजेलस

22

यह स्क्रिप्ट फ़ाइल आकार की गणना करने के कई तरीके जोड़ती है:

(
  du --apparent-size --block-size=1 "$file" 2>/dev/null ||
  gdu --apparent-size --block-size=1 "$file" 2>/dev/null ||
  find "$file" -printf "%s" 2>/dev/null ||
  gfind "$file" -printf "%s" 2>/dev/null ||
  stat --printf="%s" "$file" 2>/dev/null ||
  stat -f%z "$file" 2>/dev/null ||
  wc -c <"$file" 2>/dev/null
) | awk '{print $1}'

स्क्रिप्ट कई यूनिक्स प्रणालियों पर काम करती है जिसमें लिनक्स, बीएसडी, ओएसएक्स, सोलारिस, सनओएस आदि शामिल हैं।

फ़ाइल का आकार बाइट्स की संख्या दिखाता है। यह स्पष्ट आकार है, जो विशेष संपीड़न, या विशेष विरल क्षेत्रों, या बिना ब्लॉक वाले ब्लॉक आदि के बिना, एक विशिष्ट डिस्क पर फ़ाइल बाइट्स का उपयोग करता है।

इस स्क्रिप्ट का उत्पादन संस्करण अधिक सहायता और अधिक विकल्पों के साथ यहां है: https://github.com/SixArm/file-size


9

स्टेट सबसे कम सिस्टम कॉल के साथ ऐसा प्रतीत होता है:

$ set debian-live-8.2.0-amd64-xfce-desktop.iso

$ strace stat --format %s $1 | wc
    282    2795   27364

$ strace wc --bytes $1 | wc
    307    3063   29091

$ strace du --bytes $1 | wc
    437    4376   41955

$ strace find $1 -printf %s | wc
    604    6061   64793

8

ls -l filename आपको फ़ाइल के बारे में बहुत सारी जानकारी देगा, जिसमें उसका फ़ाइल आकार, अनुमतियां और स्वामी शामिल हैं।

पांचवें कॉलम में फ़ाइल का आकार, और बाइट्स में प्रदर्शित किया गया है। नीचे दिए गए उदाहरण में, फ़ाइलें केवल 2KB के अंतर्गत हैं:

-rw-r--r-- 1 user owner 1985 2011-07-12 16:48 index.php

संपादित करें: यह स्पष्ट रूप से statकमांड के रूप में विश्वसनीय नहीं है ।


मुझे लगता है कि दोनों ls -lऔर statकमान विश्वसनीय आकार की जानकारी देते हैं। मुझे इसके विपरीत कोई संदर्भ नहीं मिला। ls -sब्लॉकों की संख्या में आकार देगा।
dabest1

2
@ dabest1 यह इस अर्थ में विश्वसनीय नहीं है कि किसी अन्य यूनिक्स में, उनका आउटपुट अलग हो सकता है (और कुछ यूनिक्स में यह है)।
यूजीन बुजाक

हां, IIRC, Solaris ने डिफ़ॉल्ट रूप से समूह का नाम प्रदर्शित नहीं किया, जिससे आउटपुट में कम कॉलम आए।
एडवर्ड फॉक

चूंकि आकार शुद्ध संख्यात्मक है, व्हॉट्सएप से घिरा हुआ है, और तिथि वर्ष शुद्ध संख्यात्मक है, एक परिभाषित प्रारूप में, उपयोगकर्ता + मालिक को एक क्षेत्र के रूप में मानने के लिए एक regexp का उपयोग करना संभव होगा, चाहे समूह मौजूद था या नहीं। (पाठक के लिए एक अभ्यास!)
माइक 31

5

du filename आपको बाइट्स में डिस्क का उपयोग बताएगा।

मैं पसंद करता हूं du -h filename, जो आपको एक मानव पठनीय प्रारूप में आकार देता है।


2
कि या stat -c "%s";)

1
du1024 बाइट्स के ब्लॉक में प्रिंट का यह स्वाद बाइट्स की सरल गिनती नहीं है।
पीटर ल्योन

ध्यान दें कि मानक du512-बाइट इकाइयों की संख्या में आउटपुट देता है। GNU अपने वातावरण में duजब तक नहीं बुलाया जाता है POSIXLY_CORRECT, इसके बजाय kibibytes का उपयोग करता है।
स्टीफन चेज़लस

1
टाइप डायरेक्टरी की फाइलों के लिए , जो डाइरेक्टरी का डिस्क उपयोग करती है लेकिन अन्य सभी फाइलों के भीतर (पुनरावर्ती)।
स्टीफन चेज़लस 15

3

अपनी शेल स्क्रिप्ट में छोटे उपयोगिता फ़ंक्शंस बनाएं जिन्हें आप सौंप सकते हैं।

उदाहरण

#! /bin/sh -
# vim: set ft=sh

# size utility that works on GNU and BSD systems
size(){
    case $(uname) in
        (Darwin | *BSD*)
            stat -Lf %z -- "$1";;
        (*) stat -c %s -- "$1"
    esac
}

for f do
    printf '%s\n' "$f : $(gzip < "$f" | wc -c) bytes (versus $(size "$f") bytes)"
done

@ स्टीफन चेज़लस के उत्तर की जानकारी के आधार पर।


gzip -v < file > /dev/nullकिसी फ़ाइल की संपीड़ितता की जांच करने के लिए भी देखें ।
स्टीफन चेज़लस

@ स्टीफनचैलेजल को यकीन नहीं है कि मुझे लगता है कि यह एक सुधार था। उन मामलों के बयान आसानी से नॉब बंद कर सकते हैं; मुझे निश्चित रूप से यह याद नहीं है कि उन्हें कैसे प्राप्त किया जाए :-) क्या केस स्टेटमेंट स्वाभाविक रूप से अधिक पोर्टेबल हैं क्योंकि आपने ऐसा किया था? मैं उस बिंदु को देखता हूं जब दो से अधिक मामले होते हैं, लेकिन अन्यथा ... +
ओलिगोफ़्रेन

1
मुझे लगता है कि यह भी स्वाद की बात है, लेकिन यहां वह विशिष्ट मामला है जहां आप एक caseबयान का उपयोग करना चाहते हैं । caseपैटर्न मिलान करने के लिए बॉर्न / POSIX निर्माण है। [[...]]ksh / bash / zsh केवल (विविधताओं के साथ) है।
स्टीफन चेज़लस

2

मुझे एक AWK 1 लाइनर मिला, और इसमें एक बग था लेकिन मैंने इसे ठीक कर दिया। मैंने टेराबाइट्स के बाद पेटाबीट्स में भी जोड़ा।

FILE_SIZE=234234 # FILESIZE IN BYTES
FILE_SIZE=$(echo "${FILE_SIZE}" | awk '{ split( "B KB MB GB TB PB" , v ); s=1; while( $1>1024 ){ $1/=1024; s++ } printf "%.2f %s", $1, v[s] }')

ध्यान में रखते हुए स्टेट हर एक सिस्टम पर नहीं है, तो आप लगभग हमेशा AWK समाधान का उपयोग कर सकते हैं। उदाहरण; रास्पबेरी पाई में स्टेट नहीं है, लेकिन इसमें जाग है


1
पूरी तरह से नहीं ओपी ने पूछा, लेकिन काम का एक छोटा सा टुकड़ा।
जिप्सी स्पेलवेवर

0

एक अन्य POSIX आज्ञाकारी तरीका awkअपने length()फ़ंक्शन के साथ उपयोग करना होगा जो कि इनपुट फ़ाइल के प्रत्येक लाइन पर वर्णों में लंबाई को लौटाता है, नईलाइन वर्णों को छोड़कर। तो करके

awk '{ sum+=length } END { print sum+NR }' file

हम सुनिश्चित करते हैं NRकि इसमें जोड़ा जाए sum, जिससे वर्णों की कुल संख्या और फ़ाइल में मिली नई संख्याओं की कुल संख्या उत्पन्न हो। length()में समारोह awkडिफ़ॉल्ट माध्यम से एक तर्क जो लेता है length($0)जो वर्तमान पूरे लाइन के लिए है।


नहीं अगर अंतिम पंक्ति एक नई रेखा पर समाप्त नहीं होती है: printf 'a\nb' | awk '{ sum+=length } END { print sum+NR }'3 प्रिंट करना चाहिए लेकिन प्रिंट 4.
इसहाक

-1

मैं खुद को डब्ल्यूसी विकल्प पसंद करता हूं। 'बीसी' के साथ जोड़ा, आप जितनी चाहें उतनी जगहों पर दशमलव प्राप्त कर सकते हैं।

मैं एक स्क्रिप्ट को सुधारना चाह रहा था जो कि 'ls -alh' कमांड के 'फ़ाइल साइज़' कॉलम को जागृत कर रही थी। मैं केवल पूर्णांक फ़ाइल आकार नहीं चाहता था, और दो दशमलव उपयुक्त प्रतीत होते थे, इसलिए इस चर्चा को पढ़ने के बाद, मैं नीचे दिए गए कोड के साथ आया।

मेरा सुझाव है कि यदि आप इसे किसी स्क्रिप्ट में शामिल करते हैं तो अर्धविराम पर रेखा को तोड़ना चाहिए।

file=$1; string=$(wc -c $file); bite=${string% *}; okay=$(echo "scale=2; $bite/1024" | bc);friend=$(echo -e "$file $okay" "kb"); echo -e "$friend"

मेरी स्क्रिप्ट को gpfl कहा जाता है , "चित्र फ़ाइल की लंबाई प्राप्त करें" के लिए। मैं GUI jpeg दर्शक में चित्र को खोलने या फिर से लोड करने से पहले, इमेजमैगिक में एक फाइल पर एक मोगरिफाई करने के बाद इसका उपयोग करता हूं ।

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

BZT


1
मैं "स्टेट" या "एलएस" का उपयोग करना पसंद करूंगा। आमतौर पर मुझे फ़ाइल आकार प्राप्त करने के लिए "wc" का उपयोग करना पसंद नहीं है क्योंकि यह पूरी तरह से पूरी फ़ाइल को पढ़ता है। यदि आपके पास बहुत सारी फाइलें, या विशेष रूप से बड़ी फाइलें हैं, तो इसमें बहुत समय लग सकता है। लेकिन आपका समाधान रचनात्मक है ... + 1।
केविन फेगन

2
मैं फ़ाइलों के लिए "wc" पर "स्टेट" का उपयोग करने की धारणा से सहमत हूं, हालांकि यदि आप "wc -c" का उपयोग करते हैं, तो कोई डेटा नहीं पढ़ा जाएगा; इसके बजाय lseek का उपयोग किसी फ़ाइल में बाइट्स की संख्या का पता लगाने के लिए किया जाएगा। lingrok.org/xref/coreutils/src/wc.c#228
bbaja42

1
@ bbaja42: ध्यान दें कि GNU Coreutils wcफ़ाइल के अंतिम ब्लॉक को पढ़ता है, यदि stat.st_sizeकेवल एक सन्निकटन (जैसे लिनक्स /procऔर /sysफ़ाइलों के लिए) है। मुझे लगता है कि उन्होंने मुख्य टिप्पणी को और अधिक जटिल नहीं बनाने का फैसला किया, जब उन्होंने उस तर्क को कुछ हद तक
पीटर कॉर्ड्स

-1

सबसे तेज़ और सरलतम (IMO) विधि है:

bash_var=$(stat -c %s /path/to/filename)

2
फिर एक या एक से अधिक मौजूदा उत्तर जो कि स्टेट का उल्लेख करते हैं; इसे फिर से दोहराने की जरूरत ...
जेफ स्कालर

1
@JeffSchaller मैंने आपके निर्देशों पर केवल स्टीफन के उत्तर को उकेरा है। मुझे लगता है कि यह मेरे उद्देश्यों के लिए बहुत जटिल है। यही कारण है कि मैंने इस सरल उत्तर को दिमाग की आत्माओं के लिए पोस्ट किया है।
WinEunuuchs2Unix

1
धन्यवाद; यह सिर्फ इतना है कि एक "स्टेट" उत्तर का छठा उदाहरण इस प्रश्नोत्तर को सरल नहीं करता है, बल्कि एक नए पाठक से स्वयं पूछेगा "यह उत्तर अन्य लोगों से अलग कैसे है?" और कम के बजाय अधिक भ्रम की स्थिति पैदा करते हैं।
जेफ स्कालर

@JeffSchaller मुझे लगता है। लेकिन मैं कई duऔर wcजवाबों के बारे में शिकायत कर सकता था जिनके पास वास्तविक जीवन में कभी भी अस्वीकरण नहीं होना चाहिए । मैंने आज रात एक वास्तविक जीवन के आवेदन में अपने उत्तर का उपयोग किया और सोचा कि यह साझा करने योग्य था। मुझे लगता है कि हम सब अपने राय है कहते हैं
विनयुनुच्स 2 यूनिक्स ने
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.