Yanıtlar:
for name in TestSR*
do
newname=CL"$(echo "$name" | cut -c7-)"
mv "$name" "$newname"
done
Bu, ilk 6 karakteri giriş dosya cut
adı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 -c
UTF-8 gibi karakterin başına birden fazla bayt, olabilir karakter kodlamaları işlemek için yerine kullanılmalıdır.
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
rename
vahşi doğada var olan birçok versiyonu . Kendinizinkinin rename
nasıl kullanılacağını bulmak için yerel belgelerinize bakın.
rename TestSR '' *
rename "\<pre\>" "" *
->Unterminated <> operator at (user-supplied code).
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
TestSR*
dosyaları bulur CL${f#TestSR}
, yeni isim olur. Bundan sonraki sayfalar #
dosya adından ( f
) değiştirilecektir.
İş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ı buln=CL
-> Dosya adına bir CL öneki eklesed -e 's/^Test//'
-> Test önekini dosya adından kaldırırmv $a $n
-> Yeniden adlandırmayı gerçekleştirirİ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 ).
Ş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;
for f in TestSR*.[mh]
, for f in TestSR*.{m,h}
, for f in TestSR*.m TestSR*.h
.
Daha fazla bir şeye ihtiyacın olursa, bunu yapabilirsin.
perl -e 'for(@ARGV) { rename($_, $n) if( ($n = $_ ) =~ s/^TestSR/CL/) }' *