bagaimana saya bisa mengganti nama banyak file dengan menghapus karakter atau string?

21

Sebagai tindak lanjut dari pertanyaan saya sebelumnya , jika saya memiliki beberapa file formulir

sw.ras.001
sw.ras.002
sw.ras.003
…

Perintah apa yang bisa saya gunakan untuk menghapus ras.di tengah semua file?

Paul
sumber
Apakah Anda ingin menghapus hanya satu ras, yaitu berakhir dengan sw..001, atau ras., meninggalkan sw.001?
Kevin
saya mungkin ingin menghapus 'ras.' apakah perintahnya akan sangat berbeda?
Paul
Tidak, hanya apakah Anda memasukkan \.dalam pola.
Kevin

Jawaban:

35

Anda dapat melakukan ini dengan modifikasi yang cukup kecil dari salah satu jawaban dari pertanyaan terakhir:

rename s/ras\.// sw.ras.*

atau

for file in sw.ras.*; do
    mv "$file" "${file/ras./}"
done

Penjelasan:

renameadalah perlscript yang mengambil perlekspresi reguler dan daftar file, berlaku regex untuk setiap nama file pada gilirannya, dan mengganti nama setiap file untuk hasil dari penerapan regex. Dalam kasus kami, rascocok harfiah dan \.cocok literal sebuah .(sebagai .sendiri menunjukkan karakter apapun selain baris baru), dan menggantikan yang dengan apa-apa.

The forLoop mengambil semua file yang dimulai dengan sw.ras.(standar shell gumpal) dan loop atas mereka. ${var/search/replace}pencarian $varuntuk searchdan menggantikan kejadian pertama dengan replace, sehingga ${file/ras./}kembali $filedengan yang pertama ras.dihapus. Perintah dengan demikian mengubah nama file menjadi minus nama yang sama ras.. Perhatikan bahwa dengan pencarian ini dan ganti, .diambil secara harfiah, bukan sebagai karakter khusus.

Kevin
sumber
Bisakah Anda menjelaskan jawaban Anda kepada orang lain yang belajar dari? Apa yang "s / ras \ .// sw.ras. *" Lakukan? Saya kira saya mengetahuinya tetapi saya ingin memastikan, dan yang lain bisa belajar juga. Pilihan kedua dengan cara yang sama.
H_7
1
@ H_7 Ide bagus, saya sudah menambahkan penjelasan.
Kevin
14

Pilihan lain adalah menggunakan mmv (Mass MoVe dan ganti nama):

mmv '*ras.*' '#1#2'

Jangan lupa untuk menggunakan tanda kutip tunggal di sekitar pola Anda, jika bintang-bintang akan diperluas pada tingkat shell.

Utilitas tidak selalu tersedia tetapi jika tidak, Anda dapat menginstalnya dengan:

sudo apt-get install mmv

Lihat halaman manual di sini .

alexg
sumber
1
Itu alat yang hebat !!!
Christian
5

Dalam setiap shell POSIX-compliant ( bash, dash, ksh, dll):

for file in sw.ras.[[:digit:]][[:digit:]][[:digit:]]; do
    mv "${file}" "${file/ras\./}"
done

Atau dengan rename:

rename 's/ras\.//' sw.ras.[[:digit:]][[:digit:]][[:digit:]]
Chris Down
sumber
1

Saya baru-baru ini harus melakukan penggantian nama massal sejumlah file di mana saya harus mengganti kemunculan terakhir karakter di mana karakter muncul beberapa kali dalam nama file. Dalam kasus khusus ini saya harus mengganti tanda hubung terakhir -dengan garis bawah _, memutarnya:

some-long-file-name.ext

dalam hal ini:

some-long-file_name.ext

Butuh beberapa waktu tetapi ini akhirnya berhasil:

for FILE in *; do mv $FILE ${FILE%-*}_${FILE##*-}; done

Sini:

  • ${i%-*} cocok dengan awal nama file hingga kemunculan dasbor terakhir -
  • ${file##*-} cocok dengan sisa nama file setelah kemunculan dasbor terakhir -
gopherIT
sumber