බාෂ් ස්ක්රිප්ට් එකක ගොනුවක ප්රමාණය ලබා ගන්නේ කෙසේද?
මට මෙය පසුව භාවිතා කිරීමට හැකි වන පරිදි මෙය බාෂ් විචල්යයකට පවරන්නේ කෙසේද?
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 -f1
POSIX විසින් නිශ්චිතව දක්වා ඇති නිසා ඕනෑම 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
ඇත 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
.
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 -- $file
stat -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 මෙම සැබෑ ජීවිතයේ. මම අද රාත්රියේ සැබෑ ජීවිත යෙදුමක දී මගේ පිළිතුර භාවිතා කළ අතර එය බෙදා ගැනීම වටී යැයි සිතුවෙමි. මම හිතන්නේ අපි හැමෝටම අපේ මතයන් අඩුයි .