https://serverfault.com/questions/70939/how-to-replace-a-text-string-in-multiple-files-in-linux
https://serverfault.com/questions/228733/how-to-rename-multiple-files-by-replacing-word-in-file-name
https://serverfault.com/questions/212153/replace-string-in-files-with-certain-file-extension
https://serverfault.com/questions/33158/searching-a-number-of-files-for-a-string-in-linux
Artikel-artikel yang disebutkan di atas semuanya menjawab pertanyaan saya. Namun tidak satupun dari mereka yang bekerja untuk saya. Saya menduga itu karena string yang saya coba ganti memiliki # di dalamnya. Apakah ada cara khusus untuk mengatasi ini?
Saya memiliki file gambar yang é diganti dengan # U00a9 selama migrasi situs. Ini terlihat seperti ini:
Lucky-#U00a9NBC-80x60.jpg
Lucky-#U00a9NBC-125x125.jpg
Lucky-#U00a9NBC-150x150.jpg
Lucky-#U00a9NBC-250x250.jpg
Lucky-#U00a9NBC-282x232.jpg
Lucky-#U00a9NBC-300x150.jpg
Lucky-#U00a9NBC-300x200.jpg
Lucky-#U00a9NBC-300x250.jpg
Lucky-#U00a9NBC-360x240.jpg
Lucky-#U00a9NBC-400x250.jpg
Lucky-#U00a9NBC-430x270.jpg
Lucky-#U00a9NBC-480x240.jpg
Lucky-#U00a9NBC-600x240.jpg
Lucky-#U00a9NBC-600x250.jpg
Lucky-#U00a9NBC.jpg
dan saya ingin mengubahnya menjadi seperti ini:
Lucky-safeNBC-80x60.jpg
Lucky-safeNBC-125x125.jpg
Lucky-safeNBC-150x150.jpg
Lucky-safeNBC-250x250.jpg
Lucky-safeNBC-282x232.jpg
Lucky-safeNBC-300x150.jpg
Lucky-safeNBC-300x200.jpg
Lucky-safeNBC-300x250.jpg
Lucky-safeNBC-360x240.jpg
Lucky-safeNBC-400x250.jpg
Lucky-safeNBC-430x270.jpg
Lucky-safeNBC-480x240.jpg
Lucky-safeNBC-600x240.jpg
Lucky-safeNBC-600x250.jpg
Lucky-safeNBC.jpg
MEMPERBARUI:
Semua contoh ini dimulai dengan "LU00a9ucky tetapi di sini ada banyak gambar dengan nama yang berbeda. Saya hanya menargetkan bagian" # U00a9 "dari string yang akan diganti dengan" safe ".
rename
perintah. Saya menduga nama Anda akan sesederhanarename -n 's/#/safeNBC/' *.jpg
.rename -n 's/#U00a9/safe/' *.jpg
dan perintah itu diterima tetapi tidak ada perubahan terjadi.-n
adalahno act
pilihannya. Yang memungkinkan Anda melihat apakah itu berfungsi sebelum Anda benar-benar menggunakannya. Apakah output di layar menunjukkan potensi nama baru dengan benar?Jawaban:
Untuk mengganti
#
dengansomethingelse
untuk nama file di direktori saat ini (tidak rekursif) Anda dapat menggunakan utilitas ganti nama GNU :Karakter seperti
-
harus lolos dengan a\
.Untuk kasus Anda, Anda ingin menggunakannya
Perhatikan bahwa jika Anda hanya ingin mengoperasikan pada pilihan file tertentu, misalnya saja
*.jpg
, sesuaikan input akhir agar sesuai dengan pilihan itu:Untuk melakukan tes sebelum benar-benar mengubah nama file, gunakan
-n
bendera:Untuk OS X, GNU rename dapat diinstal dengan menggunakan homebrew :
brew install rename
.sumber
rename
yang Anda gunakan?# sudo pacman -S perl-rename
akan menginstal versi perl, yang lebih kuat dan mungkin cukup untuk membuat jawaban ini berfungsi untuk Anda.rename --version
kembalirename from util-linux 2.29.2
jadi itu memang bukan versi perl.rename
utilitas umum tetapi tidak ada yang dikembangkan oleh GNU: Distribusi berbasis Debian menyertakanrename
utilitas dengan paket Perl mereka sementara distribusi berbasis Red Hat menggunakanrename
utilitas dariutil-linux
dari dari Linux Kernel Organization. Tautan Anda ke fungsirename
C dari perpustakaan standar GNU./g
direname 's/#U00a9/safe/g' *
temukan daftar file lalu ganti kata kunci. di bawah ini adalah contohnya
sumber
mv
argumen Anda , jika ada spasi dalam namanyaIni tidak sulit, cukup pastikan untuk lolos dari octothorpe (#) dalam nama dengan mendahulukan slash terbalik (\).
sumber
#
suara seperti yang saya butuhkan. Saya tidak melihat garis miring terbalik dalam contoh Anda. Seharusnya terlihat seperti ini:s/\#U00a9/safe/
Untuk keluar
#
dari shell, cukup gunakan tanda kutip tunggal ('#'
), tanda kutip ganda ("#"
), atau garis miring terbalik (\#
).Yang paling sederhana dalam kasus Anda adalah menggunakan
rename
perintah (jika tersedia):sumber
rename 's/#/somethingelse/' *
) tidak berfungsi pada mesin saya (Arch Linux), yang ini berhasil.tidak yakin bagaimana cara sed, tetapi Anda dapat mencoba ini dalam bash shell:
penjelasan:
Lebih lanjut tentang substitusi parameter (yang IMO sangat kurang): http://www.tldp.org/LDP/abs/html/parameter-substitution.html
sumber
Contoh di atas tidak berfungsi pada sistem saya (CentOS 5.6) jadi saya menemukan perintah (mungkin lebih spesifik sistem) yang berfungsi (catatan: perlu melarikan diri '#' dengan
\
di baris perintah):rename \#U00a9 safe *.jpg
[Juga: Saya belum memiliki reputasi yang cukup untuk berkomentar, jadi dalam menanggapi pertanyaan Nikhil mengenai penggunaan
/g
dalamrename 's/old_string/new_string/g'
(diajukan dalam komentar untuk jawaban lain di atas):Gunakan
g
pengubah untuk melakukan substitusi 'global' (yaitu, untuk mengganti new_string dengan old_string sebanyak yang terjadi old_string). Ini seharusnya tidak perlu dalam jawaban saya karenarename
akan diterapkan ke semua file yang ditentukan dengan*
. Lihat https://www.computerhope.com/unix/rename.htm untuk penjelasan singkat tentang ini dan pengubah lainnya.]sumber
rename
OS turunan Debian. Lihat unix.stackexchange.com/a/238862/135943 . Omong-omong, CentOS 5.6 sudah cukup tua dan saya sarankan Anda memperbarui.Inilah solusi DTK yang dibungkus dengan fungsi bash yang dapat digunakan kembali:
Inilah cara Anda dapat menggunakannya:
sumber
Sebenarnya
rename
memiliki opsi tepat untuk yang dipanggil--subst
atau-s
singkatnya. Tidak perlu menggunakan sintaks regex.Jika Anda ingin mengganti / mengganti banyak kejadian, gunakan
--subst-all
atau-S
.BTW, saya hanya ingin mengganti string dengan tidak ada (menghapusnya dari nama file) ... baik kami juga memiliki opsi untuk itu
-d/--delete
dan-D/--delete-all
:sumber
Pilihan lain adalah menggunakan
pyRenamer
, aplikasi yang dibuat khusus untuk penggantian nama batch.Dapat diinstal dengan
sudo apt-get install pyrenamer
Untuk detail penggunaan, lihat file README-nya di GitHub .
sumber