मैं किसी 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 -f1
POSIX द्वारा निर्दिष्ट हैं और इसलिए किसी भी यूनिक्स प्रणाली के लिए पोर्टेबल हैं।
उदाहरण के लिए, सोलिस, बैश वाले जहाज लेकिन साथ नहीं 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
है wc
builtin (बशर्ते आप इसे सक्षम, आप भी यह के रूप में आह्वान कर सकते हैं command /opt/ast/bin/wc
), जो यह सबसे कि खोल में नियमित रूप से फ़ाइलों के लिए सक्षम बनाता है।
विभिन्न प्रणालियों में एक कमांड होती है, जिसे stat
इंटरफ़ेस stat()
या lstat()
सिस्टम कॉल कहा जाता है ।
वे रिपोर्ट जो इनोड में पाई गई हैं। उस जानकारी में से एक st_size
विशेषता है। नियमित फ़ाइलों के लिए, यह सामग्री का आकार है (त्रुटि के अभाव में इससे कितना डेटा पढ़ा जा सकता है (यही wc -c
उनके अनुकूलन में सबसे अधिक कार्यान्वयन का उपयोग करता है)। सीमलिंक के लिए, वह लक्ष्य पथ के बाइट्स में आकार है। सिस्टम के आधार पर नामित पाइपों के लिए, यह या तो 0 है या पाइप बफर में वर्तमान में बाइट्स की संख्या है। ब्लॉक डिवाइस के लिए समान जहां सिस्टम पर निर्भर करता है, आपको अंतर्निहित भंडारण के बाइट्स में 0 या आकार मिलता है।
आपको उस जानकारी को प्राप्त करने के लिए फ़ाइल को पढ़ने की अनुमति की आवश्यकता नहीं है, केवल उस निर्देशिका की अनुमति खोजें जिसे वह लिंक किया गया है।
कालानुक्रमिक क्रम से:
IRIXstat
(90):
stat -qLs -- "$file"
( ) या: st_size
का गुण लौटाता है$file
lstat()
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); stat
2005 के बाद से बिजीबॉक्स में भी (GNU से कॉपी किया गया stat
):
stat -c %s -- "$file" # st_size of file
stat -Lc %s -- "$file" # after symlink resolution
(ध्यान दें कि -L
IRIX की तुलना में इसका उल्टा अर्थ है या 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"
wc -c
का उपयोग करता है fstat
, लेकिन फिर अंतिम अप-टू- st_blksize
बाइट्स पढ़ता है । जाहिर तौर पर ऐसा इसलिए है क्योंकि लिनक्स में फाइलें /proc
और /sys
उदाहरण के लिए स्टैट साइज हैं जो केवल अनुमानित हैं । यह शुद्धता के लिए अच्छा है, लेकिन खराब है अगर फ़ाइल का अंत डिस्क पर है और मेमोरी में नहीं है (esp। यदि एक लूप में कई फ़ाइलों पर उपयोग किया जाता है)। और बहुत बुरा है अगर फ़ाइल नियर-लाइन टेप भंडारण के लिए माइग्रेट की जाती है , या उदाहरण के लिए एक FUSE पारदर्शी-अपघटन फ़ाइल सिस्टम।
ls -go file | awk '{print $3}'
-go
SysV वाले होंगे, वे 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
, जो आपको एक मानव पठनीय प्रारूप में आकार देता है।
du
1024 बाइट्स के ब्लॉक में प्रिंट का यह स्वाद बाइट्स की सरल गिनती नहीं है।
du
512-बाइट इकाइयों की संख्या में आउटपुट देता है। 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
जवाबों के बारे में शिकायत कर सकता था जिनके पास वास्तविक जीवन में कभी भी अस्वीकरण नहीं होना चाहिए । मैंने आज रात एक वास्तविक जीवन के आवेदन में अपने उत्तर का उपयोग किया और सोचा कि यह साझा करने योग्य था। मुझे लगता है कि हम सब अपने राय है कहते हैं ।