باش وان لاينر:هل تريد نسخ template_*.txt إلى foo_*.txt؟
-
09-06-2019 - |
سؤال
لنفترض أن لدي ثلاثة ملفات (template_*.txt):
- template_x.txt
- template_y.txt
- template_z.txt
أريد نسخها إلى ثلاثة ملفات جديدة (foo_*.txt).
- foo_x.txt
- foo_y.txt
- foo_z.txt
هل هناك طريقة بسيطة للقيام بذلك باستخدام أمر واحد، على سبيل المثال:
cp --enableAwesomeness template_*.txt foo_*.txt
المحلول
for f in template_*.txt; do cp $f foo_${f#template_}; done
نصائح أخرى
[01:22 PM] matt@Lunchbox:~/tmp/ba$
ls
template_x.txt template_y.txt template_z.txt
[01:22 PM] matt@Lunchbox:~/tmp/ba$
for i in template_*.txt ; do mv $i foo${i:8}; done
[01:22 PM] matt@Lunchbox:~/tmp/ba$
ls
foo_x.txt foo_y.txt foo_z.txt
طريقتي المفضلة:
for f in template_*.txt
do
cp $f ${f/template/foo}
done
طريقة "لا أتذكر صياغة الاستبدال":
for i in x y z
do
cp template_$i foo_$
done
يجب أن يعمل هذا:
for file in template_*.txt ; do cp $file `echo $file | sed 's/template_\(.*\)/foo_\1/'` ; done
for i in template_*.txt; do cp -v "$i" "`echo $i | sed 's%^template_%foo_%'`"; done
من المحتمل أن ينقطع إذا كانت أسماء الملفات الخاصة بك تحتوي على أحرف غير تقليدية.قم بإزالة "-v" عندما (إذا) تشعر بالثقة في أنه يعمل بشكل موثوق.
الامر mmv
(متوفر في ديبيان أو فينك أو من السهل تجميعها بنفسك) تم إنشاؤها خصيصًا لهذه المهمة.مع حل Bash البسيط، يجب علي دائمًا البحث عن الوثائق المتعلقة بالتوسيع المتغير.لكن mmv
أسهل بكثير في الاستخدام، وهو قريب جدًا من "الروعة"!؛-)
المثال الخاص بك سيكون:
mcp "template_*.txt" "foo_#1.txt"
mmv
يمكنه التعامل مع أنماط أكثر تعقيدًا أيضًا ولديه بعض عمليات التحقق من السلامة، على سبيل المثال، سيتأكد من عدم ظهور أي من الملفات الموجودة في مجموعة الوجهة في المجموعة المصدر (لذلك لا يمكنك الكتابة فوق الملفات عن طريق الخطأ).
لا أعرف أي شيء في bash أو cp، ولكن هناك طرق بسيطة للقيام بهذا النوع من الأشياء باستخدام (على سبيل المثال) برنامج Perl النصي:
($op = shift) || die "Usage: rename perlexpr [filenames]\n";
for (@ARGV) {
$was = $_;
eval $op;
die $@ if $@;
rename($was,$_) unless $was eq $_;
}
ثم:
rename s/template/foo/ *.txt
طريقة أخرى للقيام بذلك:
$ ls template_*.txt | sed -e 's/^template\(.*\)$/cp template\1 foo\1/' | ksh -sx
لقد تأثرت دائمًا ببرنامج ImageMagick يتحول برنامج يقوم بما تتوقعه مع تنسيقات الصور:
$ convert rose.jpg rose.png
يحتوي على برنامج شقيق يسمح بتحويلات الدفعات:
$ mogrify -format png *.jpg
ومن الواضح أن هذه تقتصر على تحويلات الصور، ولكن لديها واجهات سطر الأوامر مثيرة للاهتمام.