كيفية إعادة تسمية / نقل جميع الملفات مع امتداد معين؟
سؤال
أنا أتعلم TCL (توقع) والآن جئت إلى مشكلة مثيرة للاهتمام. أحتاج إلى أمر لنقل / إعادة تسمية مجموعة من الملفات مع التمديد .status. حاولت هذه:
spawn /bin/mv *.status some_dir
exec /bin/mv *.status some_dir
بالطبع، هذا لم ينجح. لقد غاضب قليلا ووجدت شيئا عن Glob، لكن يبدو أنه يعمل بالطريقة التي أريدها. إذا فعلت:
exec /bin/mv [glob *.status] somedir
مهد يشكو من أنه "1.status 2.status 3.Status ... إلخ." ليس ملف صالح. كما لو أن قائمة الملفات بأكملها متسلسلة في سلسلة واحدة بدلا من التعامل معها بشكل منفصل.
في محاولة للعثور على مزيد من المعلومات عبر Google تقودني إلى الكثير من الروابط المكسورة والعفا عليها الزمن، لذلك أنا آمل بجانب حل هذه المشكلة، هل يمكن أن تشيرني إلى بعض الموارد الجيدة عبر الإنترنت ل TCL / توقع الأساسيات والمخاطر الشائعة.
تحديث: سيتم قبول الحلول الوحيدة التي تستخدم TCL القياسية والأدوات القياسية في / BIN.
المحلول
$ LS -1 1.Status 2.Status rename.tclsh * بعض الكلمات / كلمتين *rename.tclsh $ ls -1 rename.tclsh * some_dir / $ ls -1 some_dir / 1.status 2.status كلمتين.
نصائح أخرى
إجابة راندي قصيرة وصحيحة ولكنها تستخدم exec دون حاجة. إجابة جوزيف قوية للغاية ولكنها طويلة بعض الشيء.
للحصول على إجابة قصيرة وذات اصطلاحي، أود استخدامها (يتطلب TCL 8.5):
ملف إعادة تسمية {*} [glob * .status] بعض_dir
proc move_to_dir {filenames dirname} {
foreach filename $filenames {
file rename $filename [file join $dirname [file tail $filename]]
}
}
# Example:
move_to_dir [glob -nocomplain *.status] ~/foo/bar/
يعمل هذا الحل مع الملفات بأسماء تحتوي على مسافات، عندما يكون هناك الكثير من الملفات وغيرها:
exec find -maxdepth 1 -name *.status -print0 | xargs -0 mv -t some_dir
لكنه يحتاج إلى العثور على و xargs التي هي في أغلب الأحيان في / USR / بن، وليس / بن.
كمستوى أمان عند استخدام أوامر "Find" المعقدة والحذف البيانات المحتملة، ألصق "صدى" أمام الأمر والتقاطه إلى ملف.
يمكنني بعد ذلك التحقق من الأوامر المدرجة في الملف قبل استخدام "المصدر" لتشغيله.
إنها أيضا طريقة للتعامل مع تلك ملفات حالة الحافة العرضية يدويا.