كيف يمكنني الحصول على أمر البحث لطباعة حجم الملف مع اسم الملف؟
-
09-06-2019 - |
سؤال
إذا قمت بإصدار أمر البحث على النحو التالي:
$ find . -name *.ear
يطبع:
./dir1/dir2/earFile1.ear
./dir1/dir2/earFile2.ear
./dir1/dir3/earFile1.ear
ما أريد "طباعته" في سطر الأوامر هو الاسم والحجم:
./dir1/dir2/earFile1.ear 5000 KB
./dir1/dir2/earFile2.ear 5400 KB
./dir1/dir3/earFile1.ear 5400 KB
المحلول
find . -name '*.ear' -exec ls -lh {} \;
فقط h الإضافي من رد jer.drab.org.يوفر الوقت في التحويل إلى ميغابايت عقليًا ؛)
نصائح أخرى
تحتاج إلى استخدام -exec أو -printf.Printf يعمل مثل هذا:
find . -name *.ear -printf "%p %k KB\n"
يعد -exec أكثر قوة ويتيح لك تنفيذ أوامر عشوائية - لذا يمكنك استخدام إصدار "ls" أو "wc" لطباعة اسم الملف مع معلومات أخرى.سيُظهر لك "man find" الوسائط المتاحة لـ printf، والتي يمكن أن تفعل أكثر بكثير من مجرد ملف.
[عدل] -printf ليس ضمن معيار POSIX الرسمي، لذا تحقق مما إذا كان مدعومًا في الإصدار الخاص بك.ومع ذلك، فإن معظم الأنظمة الحديثة ستستخدم GNU find أو إصدارًا موسعًا مشابهًا، لذلك هناك فرصة جيدة لتطبيقه.
الحل البسيط هو استخدام الخيار -ls في البحث:
find . -name \*.ear -ls
يمنحك هذا كل إدخال بالتنسيق العادي "ls -l".أو، للحصول على النتيجة المحددة التي يبدو أنك تبحث عنها، هذا:
find . -name \*.ear -printf "%p\t%k KB\n"
والذي سيعطيك اسم الملف متبوعًا بالحجم بالكيلوبايت.
باستخدام gnu find، أعتقد أن هذا هو ما تريده.يعثر على كافة الملفات الحقيقية وليس الدلائل (-type f)، ولكل منها يطبع اسم الملف (%p)، وعلامة التبويب ( )، والحجم بالكيلوبايت (%k)، واللاحقة "KB"، ثم سطر جديد ( ).
find . -type f -printf '%p\t%k KB\n'
إذا لم يقم أمر printf بتنسيق الأشياء بالطريقة التي تريدها، فيمكنك استخدام exec، متبوعًا بالأمر الذي تريد تنفيذه على كل ملف.استخدم {} لاسم الملف، وقم بإنهاء الأمر بفاصلة منقوطة (;).في معظم الأصداف، يجب تخطي هذه الأحرف الثلاثة بشرطة مائلة عكسية.
إليك حل بسيط يقوم بالعثور عليها وطباعتها باستخدام "ls -lh"، والذي سيُظهر لك الحجم في شكل يمكن قراءته بواسطة الإنسان (k للكيلوبايت، M للميجابايت):
find . -type f -exec ls -lh \{\} \;
كبديل آخر، سيقوم "wc -c" بطباعة عدد الأحرف (البايت) في الملف:
find . -type f -exec wc -c \{\} \;
find . -name '*.ear' -exec du -h {} \;
يمنحك هذا حجم الملف فقط، بدلاً من كل الأشياء غير الضرورية.
يمكن لـ Awk إصلاح المخرجات لتقديم ما طلبه السائل فقط.في نظام Solaris 10 الخاص بي، ابحث عن حجم الطباعة -ls بالكيلوبايت باعتباره الحقل الثاني، لذا:
% find . -name '*.ear' -ls | awk '{print $2, $11}'
5400 ./dir1/dir2/earFile2.ear
5400 ./dir1/dir2/earFile3.ear
5400 ./dir1/dir2/earFile1.ear
بخلاف ذلك، استخدم -exec ls -lh واختر حقل الحجم من الإخراج.مرة أخرى على سولاريس 10:
% find . -name '*.ear' -exec ls -lh {} \; | awk '{print $5, $9}'
5.3M ./dir1/dir2/earFile2.ear
5.3M ./dir1/dir2/earFile3.ear
5.3M ./dir1/dir2/earFile1.ear
لماذا لا تستخدم دو -أ ؟على سبيل المثال
find . -name "*.ear" -exec du -a {} \;
يعمل على جهاز ماك
لقد واجهت صعوبة في ذلك على نظام التشغيل Mac OS X حيث لا يدعم أمر البحث -printf
.
الحل الذي وجدته، والذي يعتمد بشكل معترف به على "المجموعة" لجميع الملفات التي تكون "موظفين" كان ...
ls -l -R | sed 's/\(.*\)staff *\([0-9]*\)..............\(.*\)/\2 \3/'
يؤدي هذا إلى تقسيم الإخراج الطويل إلى ثلاثة رموز
- الاشياء قبل النص "الموظفين"
- حجم الملف
- اسم الملف
ومن ثم إخراج الرموز 2 و 3، أي.الإخراج هو عدد البايتات ثم اسم الملف
8071 sections.php
54681 services.php
37961 style.css
13260 thumb.php
70951 workshops.php
من المفترض أن يوفر لك هذا ما تبحث عنه، بما في ذلك التنسيق (على سبيل المثال.اسم الملف أولاً وحجمه بعد ذلك):
find . -type f -iname "*.ear" -exec du -ah {} \; | awk '{print $2"\t", $1}'
إخراج العينة (حيث استخدمت -iname "*.php"
للحصول على نتيجة ما):
./plugins/bat/class.bat.inc.php 20K
./plugins/quotas/class.quotas.inc.php 8.0K
./plugins/dmraid/class.dmraid.inc.php 8.0K
./plugins/updatenotifier/class.updatenotifier.inc.php 4.0K
./index.php 4.0K
./config.php 12K
./includes/mb/class.hwsensors.inc.php 8.0K
يمكنك تجربة هذا:
find. -name *.ear -exec du {} \;
سيعطيك هذا الحجم بالبايت.لكن الأمر du يقبل أيضًا المعلمات -k لـ KB و-m لـ MB.سوف يعطيك مخرجات مثل
5000 ./dir1/dir2/earFile1.ear
5400 ./dir1/dir2/earFile2.ear
5400 ./dir1/dir3/earFile1.ear
find . -name "*.ear" | xargs ls -sh
$ find . -name "test*" -exec du -sh {} \; 4.0K ./test1 0 ./test2 0 ./test3 0 ./test4 $
جرب الأوامر التالية:
جنو stat
:
find . -type f -name *.ear -exec stat -c "%n %s" {} ';'
بي إس دي stat
:
find . -type f -name *.ear -exec stat -f "%N %z" {} ';'
لكن stat
ليست قياسية، لذلك du
أو wc
يمكن أن يكون نهجا أفضل:
find . -type f -name *.ear -exec sh -c 'echo "{} $(wc -c < {})"' ';'
find . -name "*.ear" -exec ls -l {} \;