كيف يمكنني إعادة تسمية الامتداد لمجموعة من الملفات؟
-
22-07-2019 - |
سؤال
في الدليل، لدي مجموعة من *.html
ملفات.أود إعادة تسميتهم جميعًا إلى *.txt
كيف أقوم بذلك؟أستخدم قذيفة باش.
المحلول
لحل أفضل (مع وظيفة باش فقط، بدلا من المكالمات الخارجية)، رؤية واحدة href="https://stackoverflow.com/questions/1224766/bash-rename-files/1225236#1225236"> .
وفيما يلي سوف تفعل ولا يحتاج النظام لديك برنامج rename
(على الرغم من أن معظم غالبا ما يكون هذا على نظام):
for file in *.html; do
mv "$file" "$(basename "$file" .html).txt"
done
تحرير: م> كما أشار في التعليقات، وهذا لا يعمل من أجل أسماء الملفات مع مسافات فيها دون السليم نقلا عن (وأضاف الآن أعلاه). عند العمل بحتة على الملفات الخاصة بك أن تعرف لم يكن لديك مسافات في أسماء هذا العمل ولكن كلما كنت أكتب شيئا يمكن إعادة استخدامها في وقت لاحق، لا تخطي نقلا السليم.
نصائح أخرى
إذا باستخدام باش، وليس هناك حاجة لأوامر خارجية مثل الحوار الاقتصادي الاستراتيجي، 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 يشير بشكل صحيح من هذا ليس المضمن باش. وهو أمر لينكس منفصلة. إذا كنت بحاجة فقط شيء على لينكس وهذا ينبغي أن تعمل بشكل جيد. إذا كنت بحاجة إلى شيء أكثر عبر منصة ثم نلقي نظرة على واحدة من الإجابات الأخرى. م>
على جهاز ماك...
- ثَبَّتَ إعادة تسمية إذا لم تقم بما يلي:
brew install rename
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$