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?

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.


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


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

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

3

Anda dapat mencoba dengan:

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

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


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;

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/) }' *
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.