Toplu yeniden adlandırma, ön eki değiştirme


53

Öneki birçok dosyanın yerini nasıl değiştirebilirim?

Gibi çok dosyam var

  • TestSRConnectionContext.h
  • TestSRConnectionContext.m

Hepsini değiştirmek istiyorum

  • CLConnectionContext.h
  • CLConnectionContext.m

Bunu nasıl yaparım?

Yanıtlar:


38
for name in TestSR*
do
    newname=CL"$(echo "$name" | cut -c7-)"
    mv "$name" "$newname"
done

Bu, ilk 6 karakteri giriş dosya cutadından CL, sonuçtan hazırlanır ve içinde saklanan bash komutunun yerine kullanılır $newname. Sonra eski adı yeni isimle yeniden adlandırır. Bu her dosyada gerçekleştirilir.

cut -c7-Girdiden yalnızca 7. dizinden sonraki karakterlerin döndürülmesi gerektiğini belirtir. 7-endeks 7 ile başlayan ve sonu olmayan bir aralıktır; yani, çizginin sonuna kadar.

Daha önce, ben kullanmıştı cut -b7-, ancak -cUTF-8 gibi karakterin başına birden fazla bayt, olabilir karakter kodlamaları işlemek için yerine kullanılmalıdır.


Bunu şimdi kendi başıma da anladım. Cevap olarak işaretleme. Thx
ErikTJ 6:12

Bu güzel çalışıyor, teşekkürler. -B7'nin ne yaptığını açıklayabilir misiniz? Bu, bayt listesine referans mıdır? ss64.com/bash/cut.html
imjared

@ imjared Yanıtı daha fazla ayrıntıyla güncellendi.
mrb

56

renameÇoğu Linux dağıtımında ortak olan komutu kullanmak için en basit olanı diyebilirim . Bu komutun iki yaygın sürümü vardır, hangisinin olduğunu bulmak için man sayfasını kontrol edin:

## rename from Perl (common in Debian systems -- Ubuntu, Mint, ...)
rename 's/^TestSR/CL/' *

## rename from util-linux-ng (common in Fedora systems, Red Hat, CentOS, ...)
rename TestSR CL *

Eğer bir Debian sistemindeki util-linux-ng versiyonunu kullanmak istiyorsanız, bu ad altında bulunur. rename.ul


7
Bir ihtar: renamevahşi doğada var olan birçok versiyonu . Kendinizinkinin renamenasıl kullanılacağını bulmak için yerel belgelerinize bakın.
jw013

Diğer adı kaldırmak içinrename TestSR '' *
Bsienn

hmm ... rename "\<pre\>" "" *->Unterminated <> operator at (user-supplied code).
Flash Thunder,

32

Bu gibi basit dönüşümler için Shell parametre genişletmesi yeterlidir. Komut ikame işlemi, ilave işlemlerin ortaya konması gereği nedeniyle daha az verimlidir (komut ikame işleminin kendisi ve cut/ için sed).

for f in TestSR*; do mv "$f" "CL${f#TestSR}"; done

Açıklama: TestSR*dosyaları bulur CL${f#TestSR}, yeni isim olur. Bundan sonraki sayfalar #dosya adından ( f) değiştirilecektir.
Joe Eifert

4

İşte bir yol:

ls *.{h,m} | while read a; do n=CL$(echo $a | sed -e 's/^Test//'); mv $a $n; done
  • ls *.{h,m} -> .h veya .m uzantılı tüm dosyaları bul
  • n=CL -> Dosya adına bir CL öneki ekle
  • sed -e 's/^Test//' -> Test önekini dosya adından kaldırır
  • mv $a $n -> Yeniden adlandırmayı gerçekleştirir

3

İle deneyebilirsiniz:

for i in TestSR*; do mv ${i} ${i/#TestSR/CL}; done

Detaylar için man bash("Parametre Genişletme" bölümüne bakınız ).


1

Şey, sandığım kadar zor değildi.

$ for f in TestSR*.m; do mv $f CL$(echo $f | cut -c7-); done;
$ for f in TestSR*.h; do mv $f CL$(echo $f | cut -c7-); done;

1
Gelecek için faydası olması durumunda, iki biçiminiz için komutları tekrar etmeniz gerekmez; Eğer (örneğin) kullanabilirsiniz: for f in TestSR*.[mh], for f in TestSR*.{m,h}, for f in TestSR*.m TestSR*.h.
mrb

1

Daha fazla bir şeye ihtiyacın olursa, bunu yapabilirsin.

perl -e 'for(@ARGV) { rename($_, $n) if( ($n = $_ ) =~ s/^TestSR/CL/) }' *
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.