2008-08-25 14 views
8

Üç dosyaları var ki (. Şablonu _ * txt):Bash One Liner: şablon kopyala _ *. Txt to foo _ *. Txt?

  • template_x.txt
  • template_y.txt
  • template_z.txt

üç yeni dosyalar için bunları kopyalamak istediğiniz (foo _ *. txt).

  • foo_x.txt
  • foo_y.txt
  • foo_z.txt

o tek bir komut ile, örneğin yapmak için bazı basit bir yolu var mı

cp --enableAwesomeness template_*.txt foo_*.txt

cevap

11
 
for f in template_*.txt; do cp $f foo_${f#template_}; done 
1
ben bash veya cp üzerine bir şey bilmiyorum

ama (örneğin) bir perl script kullanarak bu tür bir şey yapmak için basit yolu vardır: Sonra

($op = shift) || die "Usage: rename perlexpr [filenames]\n"; 

for (@ARGV) { 
    $was = $_; 
    eval $op; 
    die [email protected] if [email protected]; 
    rename($was,$_) unless $was eq $_; 
} 

: dosya adlarınız onları acayip karakterler varsa

rename s/template/foo/ *.txt 
+0

, monte bir Perl betiği var '/ usr/bin/rename' ('perl' paketinin bir parçası) bu neredeyse tam olarak bunu yapar. –

1
for i in template_*.txt; do cp -v "$i" "`echo $i | sed 's%^template_%foo_%'`"; done 

Muhtemelen kırar. Güvenle çalıştığından emin olursanız()) '-v'yi kaldırın.

2

Bu çalışması gerekir:

for file in template_*.txt ; do cp $file `echo $file | sed 's/template_\(.*\)/foo_\1/'` ; done 
0

Henüz başka şekilde yapmak:

$ ls template_*.txt | sed -e 's/^template\(.*\)$/cp template\1 foo\1/' | ksh -sx 

Hep ImageMagick convert programı ile etkilendim oldum sana ne yapar görüntü formatları ile bekliyoruz:

$ convert rose.jpg rose.png 

Bu toplu dönüşümler sağlayan bir kardeş programına sahiptir: Açıkçası bu görüntü dönüşümleri ile sınırlıdır

$ mogrify -format png *.jpg 

ama, ilginç bir komut satırı arayüzü var.

1

(Debian veya Fink ya da kendini derlemek kolay bulunur) komutu mmv bu görev için tam olarak yaratılmıştır. Düz Bash çözümü ile, her zaman değişken genişleme ile ilgili belgelere bakmak zorundayım. Ama mmv, "awesomeness" için oldukça yakın, kullanımı çok daha basit!;-)

Sizin örnek olacaktır:

mcp "template_*.txt" "foo_#1.txt" 

mmv yanı daha karmaşık desenleri işleyebilir ve bu bazı sağlık kontrolleri vardır, örneğin, hedef setindeki dosyaların emin hiçbiri görünür hale getirecek Kaynak kümesinde (böylece yanlışlıkla dosyaların üzerine yazamazsınız).

3

Tercih ettiğim yol:

for f in template_*.txt 
do 
    cp $f ${f/template/foo} 
done 

"Ben-yok-hatırlamak-ikame-sözdizimi" yolu:

benim debian sistemde
for i in x y z 
do 
    cp template_$i foo_$ 
done