मैं किसी bash स्क्रिप्ट में फ़ाइल का आकार कैसे प्राप्त कर सकता हूं?
मैं इसे कैसे एक bash वैरिएबल को असाइन कर सकता हूं ताकि मैं इसे बाद में उपयोग कर सकूं?
pvऔर catएक कॉपी कमांड के लिए जो प्रगति और ईटीए दिखाती है :)
मैं किसी bash स्क्रिप्ट में फ़ाइल का आकार कैसे प्राप्त कर सकता हूं?
मैं इसे कैसे एक bash वैरिएबल को असाइन कर सकता हूं ताकि मैं इसे बाद में उपयोग कर सकूं?
pvऔर catएक कॉपी कमांड के लिए जो प्रगति और ईटीए दिखाती है :)
जवाबों:
ग्नू प्रणाली पर आपका सबसे अच्छा दांव:
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 का उत्तर देखें ।
statसबसे सीधा तरीका है, यह मानते हुए कि आप लिनक्स या साइगविन ( statमानक नहीं है) का उपयोग कर रहे हैं । wc -cजैसा कि यूजेन ने बताया कि यह पोर्टेबल है।
stat: illegal option -- c
stat --printf="%s" file.txtडेबियन जेसी पर कुछ भी उत्पादन नहीं करता ...
stat -f%z myfile.tar
man statका कहना है कि --printf पीछे नई रूपरेखा को छोड़ देता है। आउटपुट का उपयोग करें --formatया -cदेखें। तुलना stat --printf="%s" file.any | xxd -करने के लिए अधिक जानकारी प्राप्त करेंstat -c "%s" file.any | xxd -
file_size_kb=`du -k "$filename" | cut -f1`
उपयोग करने statमें समस्या यह है कि यह एक GNU (Linux) एक्सटेंशन है। du -kऔर cut -f1POSIX द्वारा निर्दिष्ट हैं और इसलिए किसी भी यूनिक्स प्रणाली के लिए पोर्टेबल हैं।
उदाहरण के लिए, सोलिस, बैश वाले जहाज लेकिन साथ नहीं stat। तो यह पूरी तरह से काल्पनिक नहीं है।
lsइसमें एक समान समस्या है कि आउटपुट का सटीक प्रारूप निर्दिष्ट नहीं किया गया है, इसलिए इसके आउटपुट को पार्स करने पर इसे आंशिक रूप से नहीं किया जा सकता है। du -hएक GNU एक्सटेंशन भी है।
जहाँ संभव हो, पोर्टेबल निर्माण से चिपके रहें और आप भविष्य में किसी का जीवन आसान बना देंगे। शायद अपना।
duफ़ाइल का आकार नहीं देता है, यह इस बात का संकेत देता है कि फ़ाइल कितनी जगह का उपयोग करती है, जो सूक्ष्म रूप से भिन्न है (आमतौर पर रिपोर्ट किया duगया आकार फ़ाइल के आकार को निकटतम ब्लॉक की संख्या तक होता है, जहां एक ब्लॉक होता है आम तौर पर 512B या 1kB या 4kB) होता है।
--bytesया -bइसके बजाय -k, स्वीकृत उत्तर होना चाहिए।
-h( "मानव") का विकल्पdu : सामान्य मामलों के लिए सबसे उपयुक्त जवाब का उत्पादन करेगा file_size=`du -h "$filename" | cut -f1के रूप में यह कश्मीर (किलोबाइट), एम (मेगाबाइट) या जी (गीगाबाइट) उचित रूप में प्रदर्शित करेगा,।
आप "शब्द गणना" कमांड का उपयोग भी कर सकते हैं ( wc):
wc -c "$filename" | awk '{print $1}'
इसके साथ समस्या wcयह है कि यह फ़ाइल नाम जोड़ देगा और आउटपुट को इंडेंट कर देगा। उदाहरण के लिए:
$ wc -c somefile.txt
1160 somefile.txt
यदि आप किसी फ़ाइल आकार की गणना प्राप्त करने के लिए पूरी तरह से व्याख्या की गई भाषा या स्ट्रीम संपादक का पीछा करने से बचना चाहते हैं, तो फ़ाइल से इनपुट को पुनर्निर्देशित करें ताकि फ़ाइल wcनाम कभी न देखें:
wc -c < "$filename"
इस अंतिम रूप को कमांड प्रतिस्थापन के साथ इस्तेमाल किया जा सकता है ताकि आप आसानी से शेल चर के रूप में मांग कर सकें, जैसा कि नीचे गिलेज़ द्वारा बताया गया है ।
size="$(wc -c <"$filename")"
wc -c <"$FILENAME"इस प्रकार कोई अन्य cruft के साथ आकार देता है size=$(wc -c <"$FILENAME")।
wc -c < fileबहुत तेज़ प्रतीत होता है, कम से कम ओएस एक्स पर। मैं अनुमान लगा रहा हूं कि wc में केवल -c निर्दिष्ट होने पर फ़ाइल को स्टेट करने की कोशिश करने का दिमाग है।
wc -cका उपयोग करता है fstat, लेकिन फिर फ़ाइल के दूसरे-अंतिम ब्लॉक की तलाश करता है और अंतिम अप-टू- st_blksizeबाइट पढ़ता है । जाहिरा तौर पर ऐसा इसलिए है क्योंकि लिनक्स में फाइलें /procऔर /sysउदाहरण के लिए स्टेट्स साइज हैं जो केवल अनुमानित हैं , और wcवास्तविक आकार की रिपोर्ट करना चाहते हैं, न कि स्टेट-रिपोर्टेड साइज। मुझे लगता है कि इसकी wc -cतुलना में एक अलग आकार की रिपोर्ट करना अजीब होगा wc, लेकिन अगर यह सामान्य डिस्क फ़ाइल है, तो फ़ाइल से डेटा पढ़ने के लिए विचार नहीं है, और यह स्मृति में नहीं है। या इससे भी बदतर, पास-लाइन टेप भंडारण ...
printfअभी भी इंडेंटेशन देखता है, जैसे printf "Size: $size"-> size: <4 spaces> 54339। दूसरी ओर echoव्हॉट्सएप को नजरअंदाज करता है। इसे सुसंगत बनाने का कोई तरीका?
fstat। दौड़ने की कोशिश करें strace wc -c </etc/passwdऔर आप देख सकते हैं कि यह क्या कर रहा है।
बीएसडी (मैक ओएस एक्स) statमें एक अलग प्रारूप तर्क ध्वज है, और विभिन्न क्षेत्र विनिर्देशक हैं। से man stat(1):
-f format: निर्दिष्ट प्रारूप का उपयोग करके जानकारी प्रदर्शित करें। मान्य स्वरूपों के विवरण के लिए FORMATS अनुभाग देखें।z: बाइट्स में फ़ाइल का आकार।तो अब सब एक साथ:
stat -f%z myfile1.txt
निर्भर करता है कि आपको आकार से क्या मतलब है ।
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 -- $filestat -c %b -- "$file"stat -f %b -- "$file"perl -le 'print((lstat shift)[12])' -- "$file"wc -cका उपयोग करता है fstat, लेकिन फिर अंतिम अप-टू- st_blksizeबाइट्स पढ़ता है । जाहिर तौर पर ऐसा इसलिए है क्योंकि लिनक्स में फाइलें /procऔर /sysउदाहरण के लिए स्टैट साइज हैं जो केवल अनुमानित हैं । यह शुद्धता के लिए अच्छा है, लेकिन खराब है अगर फ़ाइल का अंत डिस्क पर है और मेमोरी में नहीं है (esp। यदि एक लूप में कई फ़ाइलों पर उपयोग किया जाता है)। और बहुत बुरा है अगर फ़ाइल नियर-लाइन टेप भंडारण के लिए माइग्रेट की जाती है , या उदाहरण के लिए एक FUSE पारदर्शी-अपघटन फ़ाइल सिस्टम।
ls -go file | awk '{print $3}'
-goSysV वाले होंगे, वे BSDs ( PIXIX में वैकल्पिक (XSI)) पर काम नहीं करेंगे। आपको भी ls -god file | awk '{print $3; exit}'( -dइसके लिए निर्देशिकाओं पर काम करना होगा, exitलक्ष्य में newlines के साथ सहानुभूति के लिए)। डिवाइस फ़ाइलों के साथ समस्याएं भी बनी हुई हैं।
wc -cसे बाइट्स की संख्या की रिपोर्ट नहीं करते हैं।
यह स्क्रिप्ट फ़ाइल आकार की गणना करने के कई तरीके जोड़ती है:
(
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
स्टेट सबसे कम सिस्टम कॉल के साथ ऐसा प्रतीत होता है:
$ 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
ls -l filename आपको फ़ाइल के बारे में बहुत सारी जानकारी देगा, जिसमें उसका फ़ाइल आकार, अनुमतियां और स्वामी शामिल हैं।
पांचवें कॉलम में फ़ाइल का आकार, और बाइट्स में प्रदर्शित किया गया है। नीचे दिए गए उदाहरण में, फ़ाइलें केवल 2KB के अंतर्गत हैं:
-rw-r--r-- 1 user owner 1985 2011-07-12 16:48 index.php
संपादित करें: यह स्पष्ट रूप से statकमांड के रूप में विश्वसनीय नहीं है ।
ls -lऔर statकमान विश्वसनीय आकार की जानकारी देते हैं। मुझे इसके विपरीत कोई संदर्भ नहीं मिला। ls -sब्लॉकों की संख्या में आकार देगा।
du filename आपको बाइट्स में डिस्क का उपयोग बताएगा।
मैं पसंद करता हूं du -h filename, जो आपको एक मानव पठनीय प्रारूप में आकार देता है।
du1024 बाइट्स के ब्लॉक में प्रिंट का यह स्वाद बाइट्स की सरल गिनती नहीं है।
du512-बाइट इकाइयों की संख्या में आउटपुट देता है। GNU अपने वातावरण में duजब तक नहीं बुलाया जाता है POSIXLY_CORRECT, इसके बजाय kibibytes का उपयोग करता है।
अपनी शेल स्क्रिप्ट में छोटे उपयोगिता फ़ंक्शंस बनाएं जिन्हें आप सौंप सकते हैं।
उदाहरण
#! /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किसी फ़ाइल की संपीड़ितता की जांच करने के लिए भी देखें ।
caseबयान का उपयोग करना चाहते हैं । caseपैटर्न मिलान करने के लिए बॉर्न / POSIX निर्माण है। [[...]]ksh / bash / zsh केवल (विविधताओं के साथ) है।
मुझे एक 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 समाधान का उपयोग कर सकते हैं। उदाहरण; रास्पबेरी पाई में स्टेट नहीं है, लेकिन इसमें जाग है ।
एक अन्य 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.
मैं खुद को डब्ल्यूसी विकल्प पसंद करता हूं। 'बीसी' के साथ जोड़ा, आप जितनी चाहें उतनी जगहों पर दशमलव प्राप्त कर सकते हैं।
मैं एक स्क्रिप्ट को सुधारना चाह रहा था जो कि '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
wcफ़ाइल के अंतिम ब्लॉक को पढ़ता है, यदि stat.st_sizeकेवल एक सन्निकटन (जैसे लिनक्स /procऔर /sysफ़ाइलों के लिए) है। मुझे लगता है कि उन्होंने मुख्य टिप्पणी को और अधिक जटिल नहीं बनाने का फैसला किया, जब उन्होंने उस तर्क को कुछ हद तक
सबसे तेज़ और सरलतम (IMO) विधि है:
bash_var=$(stat -c %s /path/to/filename)
duऔर wcजवाबों के बारे में शिकायत कर सकता था जिनके पास वास्तविक जीवन में कभी भी अस्वीकरण नहीं होना चाहिए । मैंने आज रात एक वास्तविक जीवन के आवेदन में अपने उत्तर का उपयोग किया और सोचा कि यह साझा करने योग्य था। मुझे लगता है कि हम सब अपने राय है कहते हैं ।