كيف يمكنني استخدام توجيه الإخراج في المعلمة exec لأمر البحث؟

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

  •  09-06-2019
  •  | 
  •  

سؤال

أحاول إنشاء أمر بحث لمعالجة مجموعة من الملفات في الدليل باستخدام ملفين تنفيذيين مختلفين.للأسف، -exec عند البحث لا يسمح باستخدام الأنابيب أو حتى \| لأن الصدفة تفسر هذا الحرف أولاً.

إليك على وجه التحديد ما أحاول القيام به (والذي لا يعمل لأن توجيه الإخراج ينهي أمر البحث):

find /path/to/jpgs -type f -exec jhead -v {} | grep 123 \; -print
هل كانت مفيدة؟

المحلول

جرب هذا

find /path/to/jpgs -type f -exec sh -c 'jhead -v {} | grep 123' \; -print

بدلاً من ذلك، يمكنك محاولة تضمين عبارة exec داخل البرنامج النصي sh ثم القيام بما يلي:

find -exec some_script {} \;

نصائح أخرى

هناك طريقة مختلفة قليلاً تتمثل في استخدام xargs:

find /path/to/jpgs -type f -print0 | xargs -0 jhead -v | grep 123

والتي وجدت دائمًا أنها أسهل قليلاً في الفهم والتكيف (الوسيطتان -print0 و -0 ضرورية للتعامل مع أسماء الملفات التي تحتوي على فراغات)

هذا قد (لم يتم اختباره) يكون أكثر فعالية من استخدام -exec لأنه سيقوم بتوجيه قائمة الملفات إلى xargs وxargs للتأكد من أن سطر الأوامر jhead لا يصبح طويلًا جدًا.

مع -exec يمكنك فقط تشغيل ملف تنفيذي واحد باستخدام بعض الوسائط، وليس أوامر الصدفة العشوائية.للتحايل على هذا، يمكنك استخدام sh -c '<shell command>'.

هل لاحظت أن استخدام -exec غير فعالة تماما.لكل ملف يتم العثور عليه، يجب تنفيذ الأمر مرة أخرى.سيكون أكثر كفاءة إذا كان بإمكانك تجنب ذلك.(على سبيل المثال، عن طريق تحريك grep خارج -exec أو تضخيم نتائج find ل xargs كما اقترح بالمين.)

استخدام find ربما لا يكون الأمر لهذا النوع من المهام هو البديل الأفضل.أستخدم الأمر التالي بشكل متكرر للعثور على الملفات التي تحتوي على المعلومات المطلوبة:

for i in dist/*.jar; do echo ">> $i"; jar -tf "$i" | grep BeanException; done

نظرًا لأن هذا ينتج قائمة فلن:

find /path/to/jpgs -type f -exec jhead -v {} \; | grep 123

أو

find /path/to/jpgs -type f -print -exec jhead -v {} \; | grep 123

ضع grep على نتائج البحث -exec.

هناك طريقة أخرى يمكنك من خلالها القيام بذلك ولكنها أيضًا غيتو جميلة.

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

root@ifrit findtest # find -type f -exec echo ls $"|" cat \;|sh
filename


root@ifrit findtest # find -type f -exec echo ls $"|" cat $"|" xargs cat\;|sh
h

اعتقدت للتو أنني سأضيف ذلك لأنه على الأقل بالطريقة التي تصورتها بها، كانت أقرب إلى السؤال الأصلي لـ OP المتمثل في استخدام الأنابيب داخل exec.

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