باش وان لاينر:هل تريد نسخ template_*.txt إلى foo_*.txt؟

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

  •  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

ومن الواضح أن هذه تقتصر على تحويلات الصور، ولكن لديها واجهات سطر الأوامر مثيرة للاهتمام.

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