سؤال

أنا بحاجة إلى إزالة التمديد ".تكس":

./1-aoeeu/1.tex
./2-thst/2.tex
./3-oeu/3.tex
./4-uoueou/4.tex
./5-aaa/5.tex
./6-oeua/6.tex
./7-oue/7.tex

أرجوك أن تفعل ذلك مع بعض الأدوات أدناه:

  1. Sed و تجد

  2. روبي

  3. بيثون

بلدي الفقراء محاولة:

$find . -maxdepth 2 -name "*.tex" -ok mv `sed 's@.tex@@g' {}` {} +
هل كانت مفيدة؟

المحلول

بيثون السيناريو أن تفعل الشيء نفسه:

import os.path, shutil

def remove_ext(arg, dirname, fnames):
    argfiles = (os.path.join(dirname, f) for f in fnames if f.endswith(arg))
    for f in argfiles:
        shutil.move(f, f[:-len(arg)])

os.path.walk('/some/path', remove_ext, '.tex')

نصائح أخرى

طريقة واحدة ، وليس بالضرورة أسرع (ولكن على الأقل أسرع نموا):

    pax> for i in *.c */*.c */*/*.c ; do
    ...> j=$(echo "$i" | sed 's/\.c$//')
    ...> echo mv "$i" "$j"
    ...> done

انها تعادل منذ maxdepth هو 2.السيناريو هو مجرد ترديد mv الأمر في هذه اللحظة (لأغراض الاختبار) و العمل على الملفات C (منذ لم يكن لدي أي tex الملفات إلى اختبار مع).

أو يمكنك استخدام تجد مع كل قوتها وبالتالي:

    pax> find . -maxdepth 2 -name '*.tex' | while read line ; do
    ...> j=$(echo "$line" | sed 's/\.tex$//')
    ...> mv "$line" "$j"
    ...> done

باستخدام "لأنني في" قد تسبب "الكثير من المعلمات" errrors

أفضل نهج هو أن الأنابيب العثور على في العملية المقبلة.

على سبيل المثال:

find . -type f -name "*.tex" | while read file
do
    mv $file ${file%%tex}g
done

(ملاحظة:متعود التعامل مع الملفات ذات المساحات)

باستخدام bash, find و mv من قاعدة الخاص بك الدليل.

 for i in $(find . -type f -maxdepth 2 -name "*.tex"); 
 do 
    mv $i $(echo "$i" | sed 's|.tex$||'); 
 done

الاختلاف 2 استنادا إلى إجابات أخرى هنا.

find . -type f -maxdepth 2 -name "*.tex" | while read line; 
do 
   mv "$line" "${line%%.tex}";  
done

PS:أنا لم تحصل على جزء عن الهروب '.'من قبل pax...

هناك ممتازة بيرل تسمية النصي الذي يأتي مع بعض التوزيعات ، وإلا يمكنك العثور عليها على شبكة الإنترنت.(لست متأكدا من أين يقيم رسميا ، ولكن هذا هو).تحقق مما إذا كان الخاص بك إعادة تسمية كتبه لاري وول (المؤلف القسم man rename).هذا سوف تتيح لك أن تفعل شيئا مثل:

find . [-maxdepth 2] -name "*.tex" -exec rename 's/\.tex//' '{}' \;

باستخدام -exec هو أبسط هنا لأن هناك عمل واحد فقط لأداء, و انها ليست مكلفة الاحتجاج إعادة تسمية عدة مرات.إذا كنت بحاجة إلى القيام بأشياء متعددة ، واستخدام "حين قرأت" النموذج:

find . [-maxdepth 2] -name "*.tex" | while read texfile; do rename 's/\.tex//' $texfile; done

إذا كان لديك شيء تريد أن تحتج مرة واحدة فقط:

find . [-maxdepth 2] -name "*.tex" | xargs rename 's/\.tex//'

هذا الأخير يجعل من الواضح كيف مفيدة هو إعادة تسمية - إذا كان كل شيء بالفعل في نفس المكان, كنت قد حصلت على السريع regexp إعادة تسمية.

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