المحمولة طريقة للحصول على حجم الملف (بالبايت) في شل ؟

StackOverflow https://stackoverflow.com/questions/1815329

  •  06-07-2019
  •  | 
  •  

سؤال

على لينكس, يمكنني استخدام stat --format="%s" FILE, لكن سولاريس لدي الوصول إلى لا يملك أمر stat.ماذا يجب أن تستخدم بعد ذلك ؟

أنا أكتب باش النصوص ، و حقا لا يمكن تثبيت أي برنامج جديد على النظام.

لقد فكرت بالفعل باستخدام:

perl -e '@x=stat(shift);print $x[7]' FILE

أو حتى:

ls -nl FILE | awk '{print $5}'

ولكن أيا من هذه تبدو معقولة - تشغيل بيرل فقط للحصول على حجم الملف ؟ أو تشغيل 2 الأوامر أن تفعل نفس الشيء ؟

هل كانت مفيدة؟

المحلول

وwc -c < filename (اختصار لكلمة العد، -c طباعة عدد وحدات البايت) هو محمول، <وأ href = "http://pubs.opengroup.org/onlinepubs/9699919799/utilities/wc.html" يختلط = "noreferrer" > POSIX الحل. فقط تنسيق الإخراج قد لا تكون موحدة عبر منصات التي قد إرفاق مسبقا بعض المساحات (كما هو الحال لسولاريس).

لا تغفل توجيه المدخلات. عندما يتم تمرير ملف كحجة، تتم طباعة اسم الملف بعد الفرز بايت.

وكنت قلقا انها لن تعمل من أجل الملفات الثنائية، ولكنه يعمل موافق على كل من لينكس، وسولاريس. يمكنك أن تجرب ذلك مع wc -c < /usr/bin/wc. وعلاوة على ذلك، POSIX المرافق هي مضمونة للتعامل مع الملفات الثنائية ، ما لم ينص على خلاف ذلك صراحة.

نصائح أخرى

وانتهى بي الأمر كتابة برنامج بلدي (صغير حقا) لعرض فقط من الحجم. مزيد من المعلومات هنا: HTTP: // fwhacking .blogspot.com / 2011/03 / bfsize الطباعة ملف الحجم في وحدات البايت-and.html

ووهما أكثر الطرق النظيفة في رأيي مع أدوات لينكس شيوعا هي:

$ stat -c %s /usr/bin/stat
50000

$ wc -c < /usr/bin/wc
36912

ولكن أنا فقط لا أريد أن أكون كتابة المعلمات أو أنابيب الانتاج لمجرد الحصول على حجم الملف، لذلك أنا باستخدام بلدي bfsize الخاصة.

وعلى الرغم من du عادة بطباعة استخدام القرص وليس الفعلي حجم البيانات، du GNU coreutils يمكن طباعة الملف "حجم واضح" في بايت:

du -b FILE

ولكن ذلك لن تعمل تحت BSD، وسولاريس، ماك، ...

وأخيرا قررت أن تستخدم ليرة سورية، والتوسع باش مجموعة:

TEMP=( $( ls -ln FILE ) )
SIZE=${TEMP[4]}

وانها ليست لطيفة حقا، إلا أنها على الأقل لا فقط 1 شوكة + execve، وأنها لا تعتمد على لغة البرمجة الثانوية (بيرل / روبي / بيثون / أيا كان)

عبر منصة أسرع حل (يستخدم فقط واحد شوكة() ل هل, لا تحاول العد الفعلي الشخصيات لا تفرخ غير الضرورية awk, perl, الخ).

اختبار على ماك, لينكس - قد تحتاج لتعديل بسيط سولاريس:

__ln=( $( ls -Lon "$1" ) )
__size=${__ln[3]}
echo "Size is: $__size bytes"

إذا لزم الأمر ، وتبسيط هل الحجج و ضبط تعويض في ${__ln[3]}.

ملاحظة:سوف تتبع روابط الرمزية.

وقد stat

وBSDs مع خيارات مختلفة من GNU coreutils واحد، ولكن قدرات مماثلة.

stat -f %z <file name> 

وهذا يعمل على ماك (اختبار على 10.12)، فري ، <أ href ل = "http://netbsd.gw.com/cgi-bin/man-cgi/man؟stat+1" يختلط = "noreferrer"> نت بي و <لأ href = "HTTP: //man.openbsd كافيه / stat.1 "يختلط =" noreferrer "> اكبر برهان .

إذا كنت تستخدم find من fileutils حكومة الوحدة GNU:

size=$( find . -maxdepth 1 -type f -name filename -printf '%s' )

ومما يؤسف له تطبيقات أخرى من find عادة لا تدعم -maxdepth، ولا -printf. هذا هو الحال بالنسبة لمثل سولاريس وماك find.

عند تصنيع المنتجات ls -n، كبديل للصفائف قذيفة سوء المحمولة، يمكنك استخدام الوسائط الموضعية، والتي تشكل مجموعة فقط وهي المتغيرات المحلية الوحيدة في قذيفة القياسية. التفاف الكتابة الحجج الموضعية في وظيفة للحفاظ على الحجج الأصلية لالسيناريو الخاص بك أو وظيفة.

getsize() { set -- $(ls -dn "$1") && echo $5; }
getsize FILE

وهذا يقسم الناتج من ln -dn وفقا للإعدادات متغير البيئة IFS الحالية، يسند الى الحجج الموضعية وأصداء واحد الخامس. و-d يضمن يتم التعامل مع الدلائل بشكل صحيح و-n يؤكد أن أسماء المستخدمين والمجموعات لا تحتاج إلى حل، على عكس مع -l. أيضا، يمكن أن أسماء المستخدمين والمجموعات التي تحتوي على المسافات كسر نظريا هيكل خط المتوقع. انهم غير مسموح عادة، ولكن هذا الاحتمال لا يزال يجعل موقف مبرمج والتفكير.

ويمكنك استخدام القيادة find للحصول على بعض مجموعة من الملفات (يتم استخراج هنا الملفات المؤقتة). ثم يمكنك استخدام القيادة du للحصول على حجم ملف كل ملف في شكل مقروء الإنسان باستخدام مفتاح -h.

<اقتباس فقرة>   

وfind $HOME -type f -name "*~" -exec du -h {} \;

وOUTPUT:

4.0K    /home/turing/Desktop/JavaExmp/TwoButtons.java~
4.0K    /home/turing/Desktop/JavaExmp/MyDrawPanel.java~
4.0K    /home/turing/Desktop/JavaExmp/Instream.java~
4.0K    /home/turing/Desktop/JavaExmp/RandomDemo.java~
4.0K    /home/turing/Desktop/JavaExmp/Buff.java~
4.0K    /home/turing/Desktop/JavaExmp/SimpleGui2.java~

وأنت أول مثال بيرل لا يبدو غير معقول بالنسبة لي.

وانها لأسباب مثل هذا أنني هاجرت من كتابة النصوص قذيفة (في باش / ش ... الخ) وكتابة جميع ولكن مخطوطات أتفه في بيرل. لقد وجدت أنني الحاجة إلى إطلاق بيرل لمتطلبات معينة، وكما فعلت ذلك أكثر وأكثر، وأنا أدرك أن كتابة البرامج النصية في بيرل ربما كانت أقوى (من حيث اللغة ومجموعة واسعة من المكتبات المتاحة عبر < وأ href = "http://www.cpan.org" يختلط = "نوفولو noreferrer"> CPAN ) وسيلة أكثر كفاءة لتحقيق ما أردت.

لاحظ أن غيرها من لغات البرمجة قذيفة (مثل الثعبان / روبي) لن يكون هناك شك مرافق مماثلة، وكنت قد ترغب لتقييم هذه لأغراضك. أناقش فقط بيرل لأن هذا هو اللغة يمكنني استخدام وأنا على دراية.

وإذا كان لديك بيرل على سولاريس الخاص بك، ثم استخدامه. خلاف ذلك، ليرة سورية مع AWK هو القادم أفضل رهان، حيث لم يكن لديك القانون الأساسي أو اكتشاف ليست اكتشاف جنو.

وهناك خدعة في سولاريس ولقد استخدمت، إذا كنت تسأل عن حجم أكثر من ملف واحد فإنها ترجع فقط من الحجم الكلي مع عدم وجود أسماء - حتى تشمل ملف فارغ مثل / ديف / لاغية مثل الملف الثاني:

وعلى سبيل المثال     قيادة fileyouwant / ديف / لاغية

وأنا لا يمكن أن rememebr التي أمر حجم هذا يعمل ليرة سورية / مرحاض / الخ - للأسف ليس لدي مربع سولاريس لاختباره

وعلى لينكس يمكنك استخدام du -h $FILE، يفعل ذلك العمل على سولاريس أيضا؟

هل جربت دو -ks | AWK '{طباعة $ 1 * 1024}. قد تعمل فقط.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top