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.