බාෂ් ස්ක්රිප්ට් එකක ගොනුවක ප්රමාණය ලබා ගන්නේ කෙසේද?
මට මෙය පසුව භාවිතා කිරීමට හැකි වන පරිදි මෙය බාෂ් විචල්යයකට පවරන්නේ කෙසේද?
pvසහ catපිටපතක් විධානය සඳහා වන දර්ශන ප්රගතිය සහ ETA බව :)
බාෂ් ස්ක්රිප්ට් එකක ගොනුවක ප්රමාණය ලබා ගන්නේ කෙසේද?
මට මෙය පසුව භාවිතා කිරීමට හැකි වන පරිදි මෙය බාෂ් විචල්යයකට පවරන්නේ කෙසේද?
pvසහ catපිටපතක් විධානය සඳහා වන දර්ශන ප්රගතිය සහ ETA බව :)
Answers:
GNU පද්ධතියක නම් ඔබගේ හොඳම ඔට්ටුව:
stat --printf="%s" file.any
සිට මිනිසා stat :
% s මුළු ප්රමාණය, බයිට් වලින්
බෑෂ් පිටපතක:
#!/bin/bash
FILENAME=/home/heiko/dummy/packages.txt
FILESIZE=$(stat -c%s "$FILENAME")
echo "Size of $FILENAME = $FILESIZE bytes."
සටහන: මැක් ඕඑස් එක්ස් හි ටර්මිනලයේ ස්ටැට් භාවිතා කරන්නේ කෙසේද යන්න සඳහා ch 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 විසින් නිශ්චිතව දක්වා ඇති නිසා ඕනෑම Unix මෙහෙයුම් පද්ධතියේ කිරීමට අතේ ගෙන යා හැකි වේ.
සොලාරිස්, උදාහරණයක් ලෙස, බාෂ් සමඟ නැව් නමුත් සමඟ නොවේ stat. එබැවින් මෙය මුළුමනින්ම උපකල්පිත නොවේ.
lsප්රතිදානයේ නිශ්චිත ආකෘතිය නිශ්චිතව දක්වා නොමැති නිසා සමාන ගැටළුවක් ඇති බැවින් එහි ප්රතිදානය විග්රහ කිරීම අතේ ගෙන යා නොහැක. du -hයනු GNU දිගුවකි.
හැකි සෑම තැනකම අතේ ගෙන යා හැකි ඉදිකිරීම් වලට ඇලී සිටින්න, එවිට ඔබ අනාගතයේදී යමෙකුගේ ජීවිතය පහසු කරනු ඇත. සමහර විට ඔබේම විය හැකිය.
duගොනුවේ විශාලත්වය ලබා නොදේ, එය ගොනුව කොපමණ ඉඩ ප්රමාණයක් භාවිතා කරනවාද යන්න ඇඟවුම් කරයි, එය සියුම් ලෙස වෙනස් වේ (සාමාන්යයෙන් වාර්තා duවන ප්රමාණය වන්නේ ගොනුවේ ප්රමාණය ආසන්නතම කුට්ටි ගණන දක්වා වට කර ඇති අතර එහිදී බ්ලොක් එකක් සාමාන්යයෙන් 512B හෝ 1kB හෝ 4kB වේ).
--bytesහෝ -bවෙනුවට -k, ලොව පිළිගත් පිළිතුර විය යුතුය.
-hක ( "මානව") විකල්පයdu : සාමාන්ය නඩු සඳහා වඩාත්ම සුදුසු පිළිතුරක් නිෂ්පාදනය කරනු ඇත file_size=`du -h "$filename" | cut -f1එය සුදුසු පරිදි K (කිලෝ බයිට් අඩු), එම් (මෙගාබයිට් ප්රමාණය) හෝ G (අවරෝහණ) ප්රදර්ශනය කරනු ඇත ලෙස.
ඔබට "වචන ගණන් කිරීම" විධානය භාවිතා කළ හැකිය ( 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"මේ අනුව වෙනත් කබොලක් නොමැතිව ප්රමාණය ලබා දෙයි size=$(wc -c <"$FILENAME").
wc -c < fileඅතර අවම වශයෙන් OS X මත වුවද එය ඉතා වේගවත් බව පෙනේ.
wc -cභාවිතා කරයි fstat, නමුත් පසුව ගොනුවේ දෙවන-අවසාන කොටස වෙත ගොස් අවසාන st_blksizeබයිට් කියවයි . පෙනෙන ලිනක්ස් හි ගොනු නිසා මේ /procහා /sysඋදාහරණයක් පමණක් දළ වශයෙන් බව stat ප්රමාණයෙන් , සහ wcනොව සත්ය ප්රමාණය, එම stat-වාර්තා ප්රමාණය වාර්තා කිරීමට කැමතියි. මම හිතන්නේ ඊට wc -cවඩා වෙනස් ප්රමාණයක් වාර්තා කිරීම අමුතු දෙයක් වනු ඇත wc, නමුත් එය සාමාන්ය තැටි ගොනුවක් නම් ගොනුවෙන් දත්ත කියවීම අදහසක් නොවේ, එය මතකයේ නොමැත. හෝ ඊටත් වඩා නරක නම්, ආසන්න රේඛා ටේප් ගබඩාව ...
printfඉන්ඩෙන්ටේෂන් තවමත් දකින බවක් පෙනේ , උදා printf "Size: $size"-> size: <4 spaces> 54339. අනෙක් අතට echoසුදු අවකාශය නොසලකා හරියි. එය ස්ථාවර කිරීමට ක්රමයක් තිබේද?
fstat. ධාවනය කිරීමට උත්සාහ කරන්න, strace wc -c </etc/passwdඑය කරන්නේ කුමක්දැයි ඔබට දැක ගත හැකිය.
BSD හි (macOS ගේ) statවෙනස් ආකෘති තර්ක ධජයක් සහ විවිධ ක්ෂේත්ර පිරිවිතර ඇත. සිට man stat(1):
-f format: නිශ්චිත ආකෘතිය භාවිතයෙන් තොරතුරු ප්රදර්ශනය කරන්න. වලංගු ආකෘති පිළිබඳ විස්තරයක් සඳහා FORMATS කොටස බලන්න.z: ගොනුවේ ප්රමාණය බයිට් වලින්.ඉතින් දැන් සියල්ලම එකට:
stat -f%z myfile1.txt
සටහන: GNU / Linux පද්ධතිවල විධානය භාවිතා කරන්නේ කෙසේද යන්න පිළිබඳ @ b01 පිළිතුර බලන්න stat. :)
statඅවාසනාවට එය GNU සමඟ ක්රියා නොකරයි .
ප්රමාණයෙන් ඔබ අදහස් කරන දේ මත රඳා පවතී .
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වන විශේෂණය $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); stat2005 සිට කාර්යබහුල බොක්ස් හි ද (GNU වෙතින් පිටපත් කරන ලදි stat):
stat -c %s -- "$file" # st_size of file
stat -Lc %s -- "$file" # after symlink resolution
( -LIRIX හෝ සසඳන විට එහි අර්ථය ආපසු හරවනු ලැබේ zsh stat.
BSDsstat (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}'
(ස්තූතියි ef ජෙෆ්ස්චලර් විස්තර සොයා ගැනීමට උදව් කිරීම සඳහා ).
තුළ tcsh:
@ size = -Z $file:q
(සිම්ලින්ක් විභේදනයෙන් පසු ප්රමාණය)
GNU සිය statවිධානය හඳුන්වා දීමට බොහෝ කලකට පෙර , GNU 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()සඳහා st_size, 0 සඳහා ප්රතිලාභ ලබා දෙන පද්ධති , සාමාන්යයෙන් බ්ලොක් උපාංගයේ ප්රමාණය වාර්තා කිරීමට වෙනත් ඒපීඅයි ඇත. උදාහරණයක් ලෙස, ලිනක්ස් සතුව ඇති 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, සොලාරිස්, අවම වශයෙන් HP / 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සියලු ක්රියාවලීන් පරීක්ෂා කිරීමට නොහැකි විය හැකි මෝඩකමක් නොවේ.
දැන්, මෙතෙක් අප සලකා බැලුවේ ලිපිගොනු හා සම්බන්ධ ප්රාථමික දත්තවල ප්රමාණය පමණි . එය පාර-දත්තවල ප්රමාණය සහ එම ගොනුව ගබඩා කිරීම සඳහා අවශ්ය සියලු යටිතල පහසුකම් සැලකිල්ලට නොගනී.
තවත් inode විශේෂණය විසින් ලබා 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නිදසුනක් ලෙස සංඛ්යා ප්රමාණ පමණක් ඇති අතර ඒවා දළ වශයෙන් පමණි . මෙය නිවැරදි බව සඳහා හොඳ ය, නමුත් ගොනුවේ අවසානය තැටියේ මිස මතකයේ නොමැති නම් නරක ය (උදා: බොහෝ ලිපිගොනු ලූපයක භාවිතා කරන්නේ නම්). ගොනුව ආසන්න රේඛීය ටේප් ගබඩාවට සංක්රමණය වී ඇත්නම් හෝ උදා: FUSE විනිවිද පෙනෙන-විසංයෝජන ගොනු පද්ධතියක්.
ls -go file | awk '{print $3}'
-goයනු SysV ඒවාය, ඔවුන් BSDs (POSIX හි විකල්ප (XSI)) මත ක්රියා නොකරනු ඇත. ඔබටත් අවශ්ය වනු ඇත ls -god file | awk '{print $3; exit}'( -dඑය නාමාවලිවල වැඩ කිරීමට, exitඉලක්කයේ නව රේඛා සමඟ සමමුහුර්ත කිරීම සඳහා). උපාංග ලිපිගොනු වල ගැටළු ද පවතී.
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
stat අවම පද්ධති ඇමතුම් සමඟ මෙය කරන බව පෙනේ:
$ 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.
ඔබට පැවරිය හැකි ඔබේ ෂෙල් ස්ක්රිප්ට් වල කුඩා උපයෝගිතා කාර්යයන් සාදන්න.
උදාහරණයක්
#! /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රටා ගැලපීම සඳහා බෝර්න් / පොසික්ස් ඉදිකිරීම වේ. [[...]]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, එමඟින් එහි ප්රති characters ලය වනුයේ මුළු අක්ෂර ගණන සහ ගොනුවේ ඇති නව රේඛා ගණනයි. හි length()ශ්රිතය awkපෙරනිමියෙන් length($0)වත්මන් සමස්ත රේඛාව සඳහා වන තර්කයක් ගනී .
printf 'a\nb' | awk '{ sum+=length } END { print sum+NR }'3 මුද්රණය කළ යුතු නමුත් 4 මුද්රණය කළ යුතුය.
මම wc විකල්පයට කැමතියි. 'Bc' සමඟ යුගලනය කිරීමෙන් ඔබට කැමති තරම් ස්ථානවලට දශම ලබා ගත හැකිය.
'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 නරඹන්නා තුළ පින්තූරයක් විවෘත කිරීමට හෝ නැවත පූරණය කිරීමට පෙර, මම එය භාවිතා කරන්නේ imagemagick හි ගොනුවක mogrify කිරීමෙන් පසුවය .
දැනටමත් ලබා දී ඇති සහ සාකච්ඡා කර ඇති දෙයින් බොහෝ දේ ණයට ගන්නා බැවින් මෙය "පිළිතුරක්" ලෙස සලකන්නේ කෙසේදැයි මම නොදනිමි. ඒ නිසා මම එය එහි තබමි.
BZT
wcගොනුවේ අවසාන කොටස කියවන බව සලකන්න , stat.st_sizeආසන්න වශයෙන් (ලිනක්ස් /procසහ /sysලිපිගොනු වැනි). එම තර්කනය පේළි කිහිපයක් පහළට එකතු කළ විට ප්රධාන අදහස වඩාත් සංකීර්ණ නොකිරීමට ඔවුන් තීරණය කළ බව මම අනුමාන කරමි: lingrok.org/xref/coreutils/src/wc.c#246
වේගවත්ම හා සරලම (IMO) ක්රමය:
bash_var=$(stat -c %s /path/to/filename)
duසහ wcෙනොහැකි තිබිය යුතු බව පිළිතුරු එපා DO මෙම සැබෑ ජීවිතයේ. මම අද රාත්රියේ සැබෑ ජීවිත යෙදුමක දී මගේ පිළිතුර භාවිතා කළ අතර එය බෙදා ගැනීම වටී යැයි සිතුවෙමි. මම හිතන්නේ අපි හැමෝටම අපේ මතයන් අඩුයි .