كيف يمكنني إعادة تسمية الامتداد لمجموعة من الملفات؟

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

  •  22-07-2019
  •  | 
  •  

نصائح أخرى

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

for file in *.html
do
  mv "$file" "${file%.html}.txt"
done
rename 's/\.html$/\.txt/' *.html

ويفعل بالضبط ما تريد.

وهذا عمل بالنسبة لي على OSX من. TXT إلى .txt_bak

find . -name '*.txt' -exec sh -c 'mv "$0" "${0%.txt}.txt_bak"' {} \;

وتحتاج إلى استخدام rename :

rename -S .html .txt *.html

وهذا يفعل بالضبط ما تريد - فإنه سيتم تغيير الملحق من .html إلى .txt لكافة الملفات مطابقة *.html

.

ملاحظة: جريج Hewgill يشير بشكل صحيح من هذا ليس المضمن باش. وهو أمر لينكس منفصلة. إذا كنت بحاجة فقط شيء على لينكس وهذا ينبغي أن تعمل بشكل جيد. إذا كنت بحاجة إلى شيء أكثر عبر منصة ثم نلقي نظرة على واحدة من الإجابات الأخرى.

على جهاز ماك...

  1. ثَبَّتَ إعادة تسمية إذا لم تقم بما يلي: brew install rename
  2. rename -S .html .txt *.html

لأوبونتو الأعضاء:

rename 's/\.html$/\.txt/' *.html

وهنا مثال على الأمر إعادة تسمية:

rename -n ’s/\.htm$/\.html/’ *.htm

وو-n يعني أنه اختبار تشغيل ولن يغير فعليا أي ملفات. وسوف تظهر لك قائمة من الملفات التي سيتم إعادة تسمية إذا قمت بإزالة -n. في الحالة أعلاه، فإنه سيتم تحويل كافة الملفات في الدليل الحالي من ملحق ملف .htm إلى أتش تي أم أل.

إذا بدا الناتج من تشغيل الاختبار أعلاه موافق ثم هل يمكن تشغيل النسخة النهائية:

rename -v ’s/\.htm$/\.html/’ *.htm

وو-v هو اختياري، ولكن انها فكرة جيدة لتشمل لأنه هو السجل الوحيد سيكون لديك من التغييرات التي تم إجراؤها من قبل الأمر إعادة تسمية كما هو مبين في إخراج نموذج أدناه:

$ rename -v 's/\.htm$/\.html/' *.htm
3.htm renamed as 3.html
4.htm renamed as 4.html
5.htm renamed as 5.html

والجزء صعبة في منتصف هو إجراء تبديل بيرل مع التعابير العادية، المبينة أدناه:

rename -v ’s/\.htm$/\.html/’ *.htm

بعد الزحف إلى موقع ويب شخص آخر، انتهى بي الأمر بآلاف الملفات التي تفتقد امتداد .html، عبر شجرة واسعة من الدلائل الفرعية.

لإعادة تسميتها جميعًا في لقطة واحدة، باستثناء الملفات التي تحتوي بالفعل على امتداد .html (لم يكن معظمها لا يحتوي على أي امتداد على الإطلاق)، نجح هذا معي:

cd wwwroot
find . -xtype f \! -iname *.html   -exec mv -iv "{}"  "{}.html"  \;  # batch rename files to append .html suffix IF MISSING

في حالة OP، قد أقوم بتعديل ذلك قليلاً، لإعادة تسمية ملفات *.txt فقط، كما يلي:

find . -xtype f  -iname *.txt   -exec filename="{}"  mv -iv ${filename%.*}.{txt,html}  \; 

كسر (وقت المطرقة!):

-اسم *.txt
- يعني النظر فقط في الملفات التي تنتهي بالفعل بـ .txt

MV -IV "{}. {txt ، html}" - متى يجد يمرر {} كاسم ملف، ويستخرج ${filename%.*} اسمه الأساسي دون أي امتداد لتكوين المعلمات إم في. سحق يأخذ {txt,html} لإعادة كتابته كمعلمتين بحيث يعمل الأمر النهائي على النحو التالي: mv -iv "filename.txt" "filename.html"

الإصلاح مطلوب بالرغم من ذلك:التعامل مع المسافات في أسماء الملفات

وهذا السؤال يذكر صراحة باش، ولكن إذا كنت يحدث لديها ZSH متاح أنها بسيطة جدا:

zmv '(*).*' '$1.txt'

إذا تحصل zsh: command not found: zmv ثم ببساطة تشغيل:

autoload -U zmv

وثم حاول مرة أخرى.

وبفضل هذا الأصلي المقالة للمعلومات حول zmv.

وهذا هو سليكست حل لقد وجدت أن يعمل على OSX ولينكس، وأنها تعمل بشكل جيد مع بوابة جدا!

وfind . -name "*.js" -exec bash -c 'mv "$1" "${1%.js}".tsx' - '{}' \;

وومع بوابة:

وfind . -name "*.js" -exec bash -c 'git mv "$1" "${1%.js}".tsx' - '{}' \;

قيادة mmv يبدو للقيام بهذه المهمة بكفاءة عالية على عدد كبير من الملفات ( عشرات الآلاف في الثانية). على سبيل المثال، لإعادة تسمية جميع الملفات .xml إلى .html الملفات، استخدم هذا:

mmv ";*.xml" "#1#2.html"

وعلى ; سوف يتطابق مع مسار، فإن * تطابق اسم الملف، وهذه ما يشار إليها باسم #1 و#2 باسم الاستبدال.

وكانت

وأجوبة على أساس exec أو أنابيب إما بطيئة جدا أو فشلت على عدد كبير جدا من الملفات.

وهذه محاولة

rename .html .txt *.html 

والاستعمال:

rename [find] [replace_with] [criteria]

وقليلا في وقت متأخر إلى الحزب. يمكنك أن تفعل ذلك مع xargs:

ls *.html | xargs -I {} sh -c 'mv $1 `basename $1 .html`.txt' - {}

وأو إذا كان كل ملفاتك في بعض مجلد

ls folder/*.html | xargs -I {} sh -c 'mv $1 folder/`basename $1 .html`.txt' - {}

إذا كنت تفضل PERL، هناك سيناريو القصير PERL (مكتوبة orignally لاري ستريت، خالق PERL) من شأنها أن تفعل بالضبط ما تريد هنا: tips.webdesign10.com/files/rename.pl.txt . على سبيل المثال الخاصة بك ينبغي أن يلي تفعل خدعة

وrename.pl 's/html/txt/' *.html

=)

و(loretoparisi شكرا لURL تحديث)

لسوء الحظ، ليس من السهل القيام به بشكل محمول.ربما تحتاج إلى القليل من السحر.

for file in *.html; do echo mv -- "$file" "$(expr "$file" : '\(.*\)\.html').txt"; done

قم بإزالة الصدى بمجرد أن تصبح سعيدًا لأنه يفعل ما تريد.

يحرر: basename من المحتمل أن يكون أكثر قابلية للقراءة في هذه الحالة بالذات expr أكثر مرونة بشكل عام.

وهذا هو وسيلة جيدة لتعديل ملحقات متعددة في وقت واحد:

for fname in *.{mp4,avi}
do
   mv -v "$fname" "${fname%.???}.mkv"
done

ملحوظة: يجب الحرص على حجم تمديد لتكون هي نفسها (و؟؟؟)

ونيس وبسيطة!

find . -iname *.html  -exec mv {} "$(basename {} .html).text"  \;

وهنا هو ما اعتدت أن إعادة تسمية الملفات .edge إلى .blade.php

for file in *.edge; do     mv "$file" "$(basename "$file" .edge).blade.php"; done

وتعمل مثل السحر.

وخط واحد، لا الحلقات: ls -1 | xargs -L 1 -I {} bash -c 'mv $1 "${1%.*}.txt"' _ {}

cbongiorno@ip-172-31-26-242:~/pgsql$ ls
60acbc4d-3a75-4090-85ad-b7d027df8145.json  ac8453e2-0d82-4d43-b80e-205edb754700.json
cbongiorno@ip-172-31-26-242:~/pgsql$ ls -1 | xargs -L 1 -I {} bash -c 'mv $1 "${1%.*}.txt"' _ {}
cbongiorno@ip-172-31-26-242:~/pgsql$ ls
60acbc4d-3a75-4090-85ad-b7d027df8145.txt  ac8453e2-0d82-4d43-b80e-205edb754700.txt
cbongiorno@ip-172-31-26-242:~/pgsql$ 
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top