Ganti nama massal, ubah awalan

53

Bagaimana saya bisa secara massal mengganti awalan untuk banyak file?

Saya punya banyak file seperti

  • TestSRConnectionContext.h
  • TestSRConnectionContext.m

Saya ingin mengubah semuanya

  • CLConnectionContext.h
  • CLConnectionContext.m

Bagaimana saya melakukan ini?

ErikTJ
sumber

Jawaban:

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

Ini menggunakan substitusi perintah bash untuk menghapus 6 karakter pertama dari nama file input via cut, tambahkan CLhasilnya, dan menyimpannya di $newname. Kemudian mengganti nama lama menjadi nama baru. Ini dilakukan pada setiap file.

cut -c7-menetapkan bahwa hanya karakter setelah indeks 7 yang harus dikembalikan dari input. 7-adalah rentang yang dimulai pada indeks 7 tanpa akhir; yaitu, sampai akhir baris.

Sebelumnya, saya telah menggunakan cut -b7-, tetapi -cseharusnya digunakan untuk menangani pengkodean karakter yang dapat memiliki beberapa byte per karakter, seperti UTF-8.

mrb
sumber
Terima kasih, saya juga mendapatkan ini sekarang juga. Menandai sebagai jawaban. Thx
ErikTJ
Ini bekerja dengan baik, terima kasih. Bisakah Anda jelaskan apa yang dilakukan -b7-? Apakah ini referensi ke daftar byte? ss64.com/bash/cut.html
imjared
@imjared Memperbarui jawabannya dengan lebih detail.
mrb
56

Saya akan mengatakan yang paling sederhana untuk hanya menggunakan renameperintah yang umum di banyak distribusi Linux. Ada dua versi umum dari perintah ini jadi periksa halaman manualnya untuk menemukan yang mana yang Anda miliki:

## 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 *

Jika Anda ingin menggunakan versi dari util-linux-ng di sistem Debian, tersedia dengan nama rename.ul

carandraug
sumber
7
Peringatan: beberapa versi renameada di alam liar. Periksa renamedokumentasi lokal Anda untuk mengetahui cara menggunakan milik Anda.
jw013
Untuk menghapus alias dorename TestSR '' *
Bsienn
hmm ... rename "\<pre\>" "" *->Unterminated <> operator at (user-supplied code).
Flash Thunder
33

Ekspansi parameter Shell sudah cukup untuk transformasi sederhana seperti ini. Substitusi perintah kurang efisien karena perlu menelurkan proses tambahan (untuk substitusi perintah itu sendiri dan cut/ sed).

for f in TestSR*; do mv "$f" "CL${f#TestSR}"; done
jw013
sumber
Penjelasan: TestSR*menemukan file, CL${f#TestSR}akan menjadi nama baru. Barang-barang setelah #akan diganti dari nama file ( f).
Joe Eifert
4

Ini salah satu caranya:

ls *.{h,m} | while read a; do n=CL$(echo $a | sed -e 's/^Test//'); mv $a $n; done
  • ls *.{h,m} -> Temukan semua file dengan ekstensi .h atau .m
  • n=CL -> Tambahkan awalan CL ke nama file
  • sed -e 's/^Test//' -> Menghapus awalan Uji dari nama file
  • mv $a $n -> Melakukan penggantian nama
Eric
sumber
3

Anda dapat mencoba dengan:

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

Lihat man bash(bagian "Ekspansi Parameter") untuk detailnya.

Francesco Turco
sumber
1

Yah, itu tidak sesulit yang saya kira.

$ 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;
ErikTJ
sumber
1
Jika itu membantu untuk masa depan, Anda tidak perlu mengulangi perintah untuk dua pola Anda; Anda dapat menggunakan (misalnya): for f in TestSR*.[mh], for f in TestSR*.{m,h}, for f in TestSR*.m TestSR*.h.
mrb
1

Jika Anda membutuhkan sesuatu yang lebih permanen, Anda dapat melakukan ini

perl -e 'for(@ARGV) { rename($_, $n) if( ($n = $_ ) =~ s/^TestSR/CL/) }' *
pengguna1146332
sumber