المحمولة طريقة للحصول على حجم الملف (بالبايت) في شل ؟
سؤال
على لينكس, يمكنني استخدام 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}. قد تعمل فقط.