බාෂ් ස්ක්‍රිප්ට් එකක ගොනුවක ප්‍රමාණය ලබා ගන්නේ කෙසේද?


274

බාෂ් ස්ක්‍රිප්ට් එකක ගොනුවක ප්‍රමාණය ලබා ගන්නේ කෙසේද?

මට මෙය පසුව භාවිතා කිරීමට හැකි වන පරිදි මෙය බාෂ් විචල්‍යයකට පවරන්නේ කෙසේද?



1
යුගල මේ සමග pvසහ catපිටපතක් විධානය සඳහා වන දර්ශන ප්රගතිය සහ ETA බව :)
sudo

stat -c% s file.name
neverMind9

Answers:


266

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 ගේ පිළිතුර බලන්න .


7
@ හොල්මන් 85 statයනු වඩාත් සරලම ක්‍රමයයි, ඔබ ලිනක්ස් හෝ සිග්වින් භාවිතා කරන බව උපකල්පනය කරයි ( statසම්මත නොවේ). wc -cලෙස ඉයුජින් විසින් යෝජනා අතේ ගෙන යා හැකි ය.
ගිලෙස්ගේ SO- නපුරු වීම නවත්වන්න '

2
stat: illegal option -- c
ඉලියන් ඔනොෆ්රි

stat --printf="%s" file.txtඩේබියන්
ජෙසීගෙන්

5
මැකෝස් හි මෙය ක්‍රියාත්මක වේ:stat -f%z myfile.tar
ccpizza

2
විමසුම ඔබේ විමසුම ප්‍රතිදානය නැවත ලියයි. man stat--printf පසුපසින් සිටින නව රේඛාව මඟ හැරෙන බව පවසයි. ප්‍රතිදානය භාවිතා කිරීමට --formatහෝ -cබැලීමට. සන්සන්දනය වාසි වැඩි අවබෝධයක් stat --printf="%s" file.any | xxd -සඳහාstat -c "%s" file.any | xxd -
හව්හරනක්

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

භාවිතා කිරීමේ ගැටළුව statවන්නේ එය GNU (Linux) දිගුවක් වීමයි. du -kහා cut -f1POSIX විසින් නිශ්චිතව දක්වා ඇති නිසා ඕනෑම Unix මෙහෙයුම් පද්ධතියේ කිරීමට අතේ ගෙන යා හැකි වේ.

සොලාරිස්, උදාහරණයක් ලෙස, බාෂ් සමඟ නැව් නමුත් සමඟ නොවේ stat. එබැවින් මෙය මුළුමනින්ම උපකල්පිත නොවේ.

lsප්‍රතිදානයේ නිශ්චිත ආකෘතිය නිශ්චිතව දක්වා නොමැති නිසා සමාන ගැටළුවක් ඇති බැවින් එහි ප්‍රතිදානය විග්‍රහ කිරීම අතේ ගෙන යා නොහැක. du -hයනු GNU දිගුවකි.

හැකි සෑම තැනකම අතේ ගෙන යා හැකි ඉදිකිරීම් වලට ඇලී සිටින්න, එවිට ඔබ අනාගතයේදී යමෙකුගේ ජීවිතය පහසු කරනු ඇත. සමහර විට ඔබේම විය හැකිය.


51
duගොනුවේ විශාලත්වය ලබා නොදේ, එය ගොනුව කොපමණ ඉඩ ප්‍රමාණයක් භාවිතා කරනවාද යන්න ඇඟවුම් කරයි, එය සියුම් ලෙස වෙනස් වේ (සාමාන්‍යයෙන් වාර්තා duවන ප්‍රමාණය වන්නේ ගොනුවේ ප්‍රමාණය ආසන්නතම කුට්ටි ගණන දක්වා වට කර ඇති අතර එහිදී බ්ලොක් එකක් සාමාන්‍යයෙන් 512B හෝ 1kB හෝ 4kB වේ).
ගිලෙස්ගේ SO- නපුරු වීම නවත්වන්න '

7
Il ගිලස්, විරල ලිපිගොනු (එනම් ඒවායේ සිදුරු ඇති ඒවා) දිගට වඩා අඩුවෙන් වාර්තා කරයි.
වොන්බ්‍රෑන්ඩ්

9
මෙය, සමඟ --bytesහෝ -bවෙනුවට -k, ලොව පිළිගත් පිළිතුර විය යුතුය.
Amedee Van Gasse

1
මෙම -hක ( "මානව") විකල්පයdu : සාමාන්ය නඩු සඳහා වඩාත්ම සුදුසු පිළිතුරක් නිෂ්පාදනය කරනු ඇත file_size=`du -h "$filename" | cut -f1එය සුදුසු පරිදි K (කිලෝ බයිට් අඩු), එම් (මෙගාබයිට් ප්රමාණය) හෝ G (අවරෝහණ) ප්රදර්ශනය කරනු ඇත ලෙස.
fralau

3
rafralau: OP ට අවශ්‍ය වන්නේ "මෙය බාෂ් විචල්‍යයකට පවරා දීමටයි, එවිට ඔවුන්ට එය පසුව භාවිතා කළ හැකිය", එබැවින් ඔවුන්ට අවශ්‍ය වන්නේ සත්‍ය සංඛ්‍යාත්මක අගයක් මිස මිනිසුන්ට කියවිය හැකි ආසන්න අගයක් නොවේ. එසේම, -hGNU දිගුවකි; එය සම්මත
Nemo

81

ඔබට "වචන ගණන් කිරීම" විධානය භාවිතා කළ හැකිය ( wc):

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

ගැටළුව wcවන්නේ එය ගොනු නාමය එකතු කර ප්‍රතිදානය ඇතුල් කිරීමයි. උදාහරණයක් වශයෙන්:

$ wc -c somefile.txt
    1160 somefile.txt

ලිපිගොනු ප්‍රමාණය ගණනය කිරීම සඳහා සම්පූර්ණ අර්ථකථනය කරන ලද භාෂාවක් හෝ ප්‍රවාහ සංස්කාරකයක් බැඳ තැබීමෙන් වැළකී සිටීමට ඔබ කැමති නම්, ගොනුවේ ආදානය නැවත හරවා යැවීම wcමඟින් ගොනු නාමය කිසි විටෙකත් නොදකිනු ඇත:

wc -c < "$filename"

පහත දැක්වෙන ගිලෙස් සඳහන් කළ පරිදි, ෂෙල් විචල්‍යයක් ලෙස ඔබ සොයන අගය පහසුවෙන් ලබා ගැනීමට විධාන ආදේශනය සමඟ මෙම අන්තිම පෝරමය භාවිතා කළ හැකිය .

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

32
wc -c <"$FILENAME"මේ අනුව වෙනත් කබොලක් නොමැතිව ප්‍රමාණය ලබා දෙයි size=$(wc -c <"$FILENAME").
ගිලෙස්ගේ SO- නපුරු වීම නවත්වන්න '

6
තවත් එක් කරුණක්: මම එය අත්හදා බැලූ wc -c < fileඅතර අවම වශයෙන් OS X මත වුවද එය ඉතා වේගවත් බව පෙනේ.
එඩ්වඩ් ෆෝක්

4
D එඩ්වර්ඩ්ෆෝක්: ග්නූ wc -cභාවිතා කරයි fstat, නමුත් පසුව ගොනුවේ දෙවන-අවසාන කොටස වෙත ගොස් අවසාන st_blksizeබයිට් කියවයි . පෙනෙන ලිනක්ස් හි ගොනු නිසා මේ /procහා /sysඋදාහරණයක් පමණක් දළ වශයෙන් බව stat ප්රමාණයෙන් , සහ wcනොව සත්ය ප්රමාණය, එම stat-වාර්තා ප්රමාණය වාර්තා කිරීමට කැමතියි. මම හිතන්නේ ඊට wc -cවඩා වෙනස් ප්‍රමාණයක් වාර්තා කිරීම අමුතු දෙයක් වනු ඇත wc, නමුත් එය සාමාන්‍ය තැටි ගොනුවක් නම් ගොනුවෙන් දත්ත කියවීම අදහසක් නොවේ, එය මතකයේ නොමැත. හෝ ඊටත් වඩා නරක නම්, ආසන්න රේඛා ටේප් ගබඩාව ...
පීටර් කෝර්ඩ්ස්

1
printfඉන්ඩෙන්ටේෂන් තවමත් දකින බවක් පෙනේ , උදා printf "Size: $size"-> size: <4 spaces> 54339. අනෙක් අතට echoසුදු අවකාශය නොසලකා හරියි. එය ස්ථාවර කිරීමට ක්‍රමයක් තිබේද?
ඉයුජින් කුලබුහෝව්

2
@keithpjolley: ඇමතීමෙන් fstat. ධාවනය කිරීමට උත්සාහ කරන්න, strace wc -c </etc/passwdඑය කරන්නේ කුමක්දැයි ඔබට දැක ගත හැකිය.
Nemo

53

BSD හි (macOS ගේ) statවෙනස් ආකෘති තර්ක ධජයක් සහ විවිධ ක්ෂේත්‍ර පිරිවිතර ඇත. සිට man stat(1):

  • -f format: නිශ්චිත ආකෘතිය භාවිතයෙන් තොරතුරු ප්‍රදර්ශනය කරන්න. වලංගු ආකෘති පිළිබඳ විස්තරයක් සඳහා FORMATS කොටස බලන්න.
  • ... ආකෘති අංශය ...
  • z: ගොනුවේ ප්‍රමාණය බයිට් වලින්.

ඉතින් දැන් සියල්ලම එකට:

stat -f%z myfile1.txt

සටහන: GNU / Linux පද්ධතිවල විධානය භාවිතා කරන්නේ කෙසේද යන්න පිළිබඳ @ b01 පිළිතුර බලන්න stat. :)


මෙය BSD පමණක් විසඳුමක් බව සලකන්න. statඅවාසනාවට එය GNU සමඟ ක්‍රියා නොකරයි .
joeytwiddle

32

ප්‍රමාණයෙන් ඔබ අදහස් කරන දේ මත රඳා පවතී .

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 -- $file
  • ග්නූ stat -c %b -- "$file"
  • BSD stat -f %b -- "$file"
  • perl -le 'print((lstat shift)[12])' -- "$file"

පැහැදිලිවම වඩාත්ම පුළුල් හා තොරතුරු සහිත පිළිතුර. ඔබට ස්තුතියි. BSD සහ GNU සංඛ්‍යාලේඛන තොරතුරු භාවිතා කරමින් හරස් වේදිකා බෑෂ් ස්ක්‍රිප්ට් නිර්මාණය කිරීමට මට මෙය භාවිතා කළ හැකිය
ඔලිගොෆ්‍රන්

1
විනෝදජනක කාරණය: GNU coreutils wc -cභාවිතා කරයි fstat, නමුත් පසුව අවසන් st_blksizeබයිට් කියවයි . පෙනෙන විදිහට මෙයට හේතුව ලිනක්ස් හි ලිපිගොනු /procසහ /sysනිදසුනක් ලෙස සංඛ්‍යා ප්‍රමාණ පමණක් ඇති අතර ඒවා දළ වශයෙන් පමණි . මෙය නිවැරදි බව සඳහා හොඳ ය, නමුත් ගොනුවේ අවසානය තැටියේ මිස මතකයේ නොමැති නම් නරක ය (උදා: බොහෝ ලිපිගොනු ලූපයක භාවිතා කරන්නේ නම්). ගොනුව ආසන්න රේඛීය ටේප් ගබඩාවට සංක්‍රමණය වී ඇත්නම් හෝ උදා: FUSE විනිවිද පෙනෙන-විසංයෝජන ගොනු පද්ධතියක්.
පීටර් කෝර්ඩ්ස්

මෙම කාර්යය ද ls -go file | awk '{print $3}'
ස්ටීවන් පෙනි

Te ස්ටීවන්පෙනී -goයනු SysV ඒවාය, ඔවුන් BSDs (POSIX හි විකල්ප (XSI)) මත ක්‍රියා නොකරනු ඇත. ඔබටත් අවශ්‍ය වනු ඇත ls -god file | awk '{print $3; exit}'( -dඑය නාමාවලිවල වැඩ කිරීමට, exitඉලක්කයේ නව රේඛා සමඟ සමමුහුර්ත කිරීම සඳහා). උපාංග ලිපිගොනු වල ගැටළු ද පවතී.
ස්ටෙෆාන් චසෙලාස්

1
Ix ғsғ යුනික්ස් ඒපීඅයි පෙළ සහ ද්විමය ගොනු අතර වෙනසක් නොදක්වයි. ඒ සියල්ල බයිට් අනුපිළිවෙලකි. සමහර යෙදුම් වලට එම බයිට් පෙළ ලෙස අර්ථ දැක්වීමට අවශ්‍ය විය හැකි නමුත් පැහැදිලිවම 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

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

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
un dabest1 වෙනත් යුනික්ස් එකක, ඒවායේ ප්‍රතිදානය වෙනස් විය හැකිය යන අර්ථයෙන් එය විශ්වාසදායක නොවේ (සමහර යුනික්ස් වලදී එය එසේ වේ).
ඉයුජින් බුජාක්

ඔව්, IIRC, සොලාරිස් පෙරනිමියෙන් කණ්ඩායම් නාමය ප්‍රදර්ශනය නොකළ අතර ප්‍රතිදානයේ තීරු අඩු විය.
එඩ්වඩ් ෆෝක්

ප්‍රමාණය පිරිසිදු සංඛ්‍යාත්මක, සුදු අවකාශයෙන් වටවී ඇති අතර, දිනය වර්ෂය පිරිසිදු සංඛ්‍යාත්මක බැවින්, නිශ්චිත ආකෘතියකින්, කණ්ඩායම පැමිණ සිටියත් නැතත්, පරිශීලක + හිමිකරු එක් ක්ෂේත්‍රයක් ලෙස සැලකීමට රීජෙක්ස්ප් භාවිතා කළ හැකිය. (
පා er කයා

5

du filename බයිට් වලින් තැටි භාවිතය ඔබට කියනු ඇත.

මම කැමතියි du -h filename, එය ඔබට මිනිස් කියවිය හැකි ආකෘතියකින් ප්‍රමාණය ලබා දෙයි.


2
that or stat -c "%s";)

1
මෙම රසය duබයිට් 1024 ක ප්‍රමාණයකින් මුද්‍රණය කරයි, සරල බයිට් ගණනක් නොවේ.
පීටර් ලියොන්ස්

සම්මත duමඟින් බයිට් ඒකක 512 කින් ප්‍රතිදානයක් ලබා දෙන බව සලකන්න . GNU එහි පරිසරය duසමඟ කැඳවන්නේ නැත්නම් ඒ වෙනුවට කිබිබයිට් භාවිතා කරයි POSIXLY_CORRECT.
ස්ටෙෆාන් චසෙලාස්

1
ටයිප් ඩිරෙක්ටරියේ ගොනු සඳහා , එමඟින් ඩිරෙක්ටරියේ තැටි භාවිතය පමණක් නොව අනෙකුත් සියලුම ගොනු (පුනරාවර්තන ලෙස) ලබා දේ.
ස්ටෙෆාන් චසෙලාස්

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රටා ගැලපීම සඳහා බෝර්න් / පොසික්ස් ඉදිකිරීම වේ. [[...]]ksh / bash / zsh පමණි (වෙනස්කම් සහිතව).
ස්ටෙෆාන් චසෙලාස්

3

මම 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
OP ඇසූ දෙය සම්පුර්ණයෙන්ම නොවේ, නමුත් ලස්සන කුඩා වැඩ කොටසකි.
user207673

0

තවත් එක් 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 මුද්‍රණය කළ යුතුය.
අයිසැක්

-1

මම 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


1
මම "stat" හෝ "ls" භාවිතා කිරීමට කැමැත්තෙමි. සාමාන්‍යයෙන් මම "wc" ගොනු ප්‍රමාණ ලබා ගැනීමට කැමති නැත, මන්ද එය මුළු ගොනුවම භෞතිකව කියවන බැවිනි. ඔබ සතුව ලිපිගොනු විශාල ප්‍රමාණයක් හෝ විශේෂයෙන් විශාල ගොනු තිබේ නම් මේ සඳහා බොහෝ කාලයක් ගතවනු ඇත. නමුත් ඔබේ විසඳුම නිර්මාණාත්මකයි ... + 1.
කෙවින් ෆෙගන්

2
ලිපිගොනුකරණය සඳහා "wc" ට වඩා "stat" භාවිතා කිරීමේ අදහස සමඟ මම එකඟ වෙමි, කෙසේ වෙතත් ඔබ "wc -c" භාවිතා කරන්නේ නම්, දත්ත කිසිවක් කියවනු නොලැබේ; ගොනුවක ඇති බයිට් ගණන හඳුනා ගැනීමට lseek භාවිතා කරනු ඇත. lingrok.org/xref/coreutils/src/wc.c#228
bbaja42

1
ba bbaja42: GNU Coreutils wcගොනුවේ අවසාන කොටස කියවන බව සලකන්න , stat.st_sizeආසන්න වශයෙන් (ලිනක්ස් /procසහ /sysලිපිගොනු වැනි). එම තර්කනය පේළි කිහිපයක් පහළට එකතු කළ විට ප්‍රධාන අදහස වඩාත් සංකීර්ණ නොකිරීමට ඔවුන් තීරණය කළ බව මම අනුමාන කරමි: lingrok.org/xref/coreutils/src/wc.c#246
පීටර් කෝඩ්ස්

-1

වේගවත්ම හා සරලම (IMO) ක්‍රමය:

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

2
ඉන්පසු සංඛ්‍යාලේඛන සඳහන් දැනට පවතින පිළිතුරු එකක් හෝ කිහිපයක් ඉදිරිපත් කරන්න; නැවත එය නැවත කිරීමට අවශ්‍ය නැත ...
ජෙෆ් ෂලර්

1
E ජෙෆ්ෂලර් ඔබේ උපදෙස් මත මම ස්ටෙෆේන්ගේ පිළිතුර ඉහළට ඔසවා තැබුවෙමි. මම හිතන්නේ එය මගේ අරමුණු සඳහා ඉතා සංකීර්ණයි. ඒ නිසා තමයි මම මේ සරල පිළිතුර පළ කළේ සමාන මනසක් ඇති අය සඳහා.
WinEunuuchs2Unix

1
ඔබට ස්තුතියි; එය හුදෙක් බව ය හයවන එය "stat" පිළිතුර උදාහරණයක් මෙම ප්රශ්න හා පිළිතුරු සරල නැත, ඒ වෙනුවට, නව පාඨකයා තමන් තුළ ඇති වෙන්නේ නැද්ද? "කොහොමද අනෙක් අය මේ පිළිතුර වෙනස් වන්නේ මන්ද?" අඩු වෙනුවට වඩා ව්‍යාකූලත්වයට මඟ පාදයි.
ජෙෆ් ෂලර්

E ජෙෆ්ස්චලර් මම හිතන්නේ. නමුත් මම බොහෝ ගැන පැමිණිලි කළ හැකි duසහ wcෙනොහැකි තිබිය යුතු බව පිළිතුරු එපා DO මෙම සැබෑ ජීවිතයේ. මම අද රාත්‍රියේ සැබෑ ජීවිත යෙදුමක දී මගේ පිළිතුර භාවිතා කළ අතර එය බෙදා ගැනීම වටී යැයි සිතුවෙමි. මම හිතන්නේ අපි හැමෝටම අපේ මතයන් අඩුයි .
WinEunuuchs2Unix
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.