Bagaimana cara mengganti nama banyak file dengan mengganti kata dalam nama file?

36

Ganti ACDC ke AC-DC

Misalnya kita punya file-file ini

ACDC - Rock N 'Roll Bukanlah Suara Bising.xxx

ACDC - Rocker.xxx

ACDC - Shoot To Thrill.xxx

Saya ingin mereka menjadi:

AC-DC - Rock N 'Roll Tidak Ada Bising Polusi.xxx

AC-DC - Rocker.xxx

AC-DC - Tembak Ke Thrill.xxx

Saya tahu bahwa sed atau awk digunakan untuk operasi ini. Saya tidak bisa google apa-apa jadi saya meminta bantuan Anda =) Bisakah Anda memberikan perintah shell bekerja penuh untuk tugas ini?

Umpan balik: Solusi untuk pengguna OSX

holms
sumber
1
Saya rasa ada pertanyaan yang lebih besar di sini - apakah Anda mencoba memperbaiki nama file mp3 secara umum? Ada beberapa skrip yang telah ditulis orang selama bertahun-tahun untuk melakukan ini. Saya pikir yang saya gunakan dipanggil mp3fixer.
Phil Hollenback
tidak, ini bukan tentang mp3, saya hanya perlu mengelola beberapa file besar dengan nama yang sama, dan sesuatu yang semuanya harus diganti atau diperbaiki ... situasi umum jadi saya memerlukan solusi bagus ini untuk mengganti nama semuanya
holms

Jawaban:

45
rename 's/ACDC/AC-DC/' *.xxx

dari man rename

DESCRIPTION
       "rename" renames the filenames supplied according to the rule specified as the 
first argument.  The perlexpr argument is a Perl expression which is expected to modify the 
$_ string in Perl for at least some of the filenames specified.  If a given filename is not 
modified by the expression, it will not be renamed.  If no filenames are given on
           the command line, filenames will be read via standard input.

Misalnya, untuk mengganti nama semua file yang cocok dengan "* .bak" untuk menghapus ekstensi, Anda mungkin mengatakan

rename 's/\.bak$//' *.bak

Untuk menerjemahkan nama huruf besar ke bawah, Anda akan menggunakan

rename 'y/A-Z/a-z/' *
Joel K
sumber
5
Perhatikan bahwa banyak mesin linux datang dengan rename dari util-linux, yang mengimplementasikan substitusi sederhana, bukan regex. Jadi jika mengganti nama gagal diam-diam tanpa melakukan apa-apa, Anda mungkin menggunakan yang salah rename.
Phil Hollenback
Saya sudah mencari ini sejak lama! thnx!
holms
@ PhilHollenback Bagaimana menemukan / menginstal yang benar? :)
henry
Itu tidak berfungsi ketika saya memiliki garis bawah pada nama file saya dan bukannya spasi - bagaimana saya bisa menyelesaikannya?
unfa
13

Jawaban ini berisi bagian-bagian yang baik dari semua jawaban lain, sementara meninggalkan bidat seperti ls | while read.

Direktori saat ini:

for file in ACDC*.xxx; do
    mv "$file" "${file//ACDC/AC-DC}"
done

Termasuk subdirektori:

find . -type f -name "ACDC*" -print0 | while read -r -d '' file; do
    mv "$file" "${file//ACDC/AC-DC}"
done

Karakter baris baru benar - benar tidak mungkin ada dalam nama file, jadi ini bisa lebih sederhana saat masih bekerja dengan nama yang mengandung spasi:

find . -type f -name "ACDC*" | while read -r file; do
    mv "$file" "${file//ACDC/AC-DC}"
done
grawity
sumber
9

Untuk menggunakan versi util-linux renameyang dimaksud Phil (di Ubuntu, namanya rename.ul):

rename ACDC AC-DC ACDC*

atau

rename.ul ACDC AC-DC ACDC*
Dijeda sampai pemberitahuan lebih lanjut.
sumber
1
varian Anda adalah yang terbaik =) begitu banyak artikel bodoh di google tentang temukan dan kirim dan awk ... untuk operasi sederhana ini yang sudah renameutils egxist!
holms
4

Menggunakan shell bash

find . -type f -name "ACDC*" -print0 | while read -d $'\0' f
do
   new=`echo "$f" | sed -e "s/ACDC/AC-DC/"`
   mv "$f" "$new"
done

Catatan: menggunakan findakan memproses direktori saat ini, dan direktori di bawah.

Dering Ø
sumber
1

Tergantung pada cangkang Anda. Di zsh, saya akan melakukan ini:

for file in ACDC*.xxx; do
    mv "$file" "$(echo $file | sed -e 's/ACDC/AC-DC/')"
done

Mungkin bukan solusi terbaik, tetapi berhasil.

polemon
sumber
1

Menggunakan bash:

ls *.xxx | while read fn; do
    mv "${fn}" "${fn/ACDC/AC-DC}";
done

Jika Anda renamemenginstal program:

rename 's/ACDC/AC-DC/' *.xxx
ThatGraemeGuy
sumber