سؤال تشغيل الآلاف من الأوامر بالتسلسل


لدي مهمة الآن لتشغيل بعض الآلاف من الأوامر بالتسلسل. الأوامر كلها في الشكل $ /home/user/.lcmodel/bin/lcmodel < 2HzSNR100C2.5.txt. فقط الأرقام (في بالخط العريض اكتب) تختلف من ملف إلى ملف. يتم إنشاء الأرقام من for حلقة في MatLab.

على سبيل المثال ، الرقم من قبل Hz سوف يكون 2 و 3، الرقم بعد SNR سوف يكون 100 و 200والأرقام بعد C سوف يكون 2.5، 3 و 3.5. في هذه الحالة ، لا بد لي من تشغيل 12 من هذا النوع من الأوامر. ونعم ، أنا فقط بحاجة إلى تشغيلها كخطوط واحدة ، يتم تخزين رموز مفصلة بالفعل في ملفات النص.

أنا جديد تمامًا في لينكس ، هل يستطيع أحد أن يساعدني في كتابة ملف أو أمر لتشغيل هذه الآلاف من الأوامر بشكل تسلسلي وتلقائي؟


4
2017-09-07 12:39


الأصل


يرجى تعديل سؤالك ببعض التفاصيل: كيف يتم تغيير هذه الأرقام؟ هل من المناسب أن يكون لديك طلب خاص للأوامر؟ هل هذه الملفات وحدها في دليل مخصص؟ - Jakob Lenfers
عذرًا ، على سبيل المثال ، الرقم قبل Hz سيكون 2 و 3 ، العدد بعد أن يكون SNR 100 و 200 ، الأرقام بعد C ستكون 2.5 و 3 و 3.5. في هذه الحالة ، لا بد لي من تشغيل 12 هذا النوع من الأوامر. ونعم ، أنا فقط بحاجة إلى تشغيلها كخطوط واحدة ، يتم تخزين رموز مفصلة بالفعل في ملفات النص. شكرا جزيلا! - Charlie So
استخدم حلقة. لأني في * .txt ... / مسار / إلى / lcmodel $ i ... فعلت استخدام العثور على تحديد الملفات إذا لزم الأمر. بدون المزيد من التفاصيل ، يمكنني فقط تقديم اقتراحات. نرى tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-7.html - Panther


الأجوبة:


إذا كانت جميع الملفات موجودة في دليل العمل الحالي (بمعنى أنه لا يوجد أي جزء في دليل فرعي) ، فاستخدم a bash  for حلقة (بفضل Incnis Mrsi لنمط globing أكثر تشددًا):

for f in ?HzSNR???C*.txt; do /home/user/.lcmodel/bin/lcmodel < "$f"; done

هذا النمط المحدد من غلوبلينج ضيق للغاية. أيضا باستخدام globbing نفسه سيؤدي إلى قائمة مرتبة من الملفات في دليل العمل الحالي لتوسيعها في for بيان ، في نهاية المطاف ، في الملفات التي تتم معالجتها في ترتيبها العددي ؛

إذا لم تكن جميع الملفات موجودة في دليل العمل الحالي ، فاستخدم البحث:

find . -type f -name '?HzSNR???C*.txt' -exec /home/user/.lcmodel/bin/lcmodel < {} \;

ومع ذلك استخدام find بشكل عام لا يضمن أن تتم معالجة الملفات بترتيبها الرقمي ؛ إذا كان معالجتها بترتيبها العددي إلزاميًا ، فاستخدمها find + sort + xargs:

find . -type f -name '?HzSNR???C*.txt' | sort | xargs -I file /home/user/.lcmodel/bin/lcmodel < file

12
2017-09-07 13:34



* غير آمن. كلما أمكن ، استخدم ? بالضبط واحد حرف، ?? لاثنين بالضبط ، الخ - Incnis Mrsi
ال for سينفجر الحل إذا كان عدد الملفات كبيرًا جدًا. ال find يجب أن تعمل الحلول مع أي عدد من الملفات. - chicks
في الواقع ، أشار إلى أنه خارج وإضافة حل بديل باستخدام find. شكر - kos
heymayl كنت على صواب rm، لكن ال for هو الأمر الذي يتم تنفيذه من قبل ARG_MAX أيضًا ، بحيث تكون محدودًا في عدد الملفات أو أكثر عدد الأحرف في أسماء الملفات بالضبط مما يحد بشكل فعال من عدد الملفات. find هو صديقك الغريب لكن المفيد. - chicks
@ Thaicks Thats غير صحيحة ، تلك الملفات وجدت بعد التوسع الكوني ليست حجج ل for، لأنهم سيتعاملون معهم بشكل فردي في نهاية المطاف حيث يتم التوسع عن طريق القشرة نفسها (و for في المدمج في) .. لديك اختبار ، في المحاولة الأولى touch {1..1000000}، ثم for i in {1..1000000}; do touch "$i"; done..في الحالة الأولى التي يجب أن تحصل عليها bash: /usr/bin/touch: Argument list too long، في الحالة الثانية يجب إنشاء ملفات مليون .. - heemayl