Ini adalah salah satu metode substitusi parameter yang ditampilkan dalam Mendel Coopers Advanced Bash-scripting guide tldp.org/LDP/abs/html
W_Whalley
2
@ W_Whalley Saya sangat merekomendasikan untuk menghindari panduan itu, demi Panduan Wooledge Bash .
Wildcard
@ Kartu Memori: apa alasan Anda merekomendasikan untuk menghindari panduan ABS?
Christian Severin
@ChristianSeverin mempromosikan praktik buruk dan kode langsung rusak. Periksa tautan di halaman profil saya.
Wildcard
Jika Anda tidak tahu bagaimana mengadaptasi contoh ini untuk pola file yang berbeda, Anda mungkin ingin melihat Bagian Ekspansi Parameter dari panduan yang disebutkan di atas.
lex82
108
Pada Debian dan turunannya, renamekarya Perl mirip sedseperti ini:
rename -v 's/image//'*.png
Ada juga renamedari util-linuxyang bekerja seperti ini, sebagai gantinya:
Anda benar-benar harus menjelaskan bahwa ini adalah program perl yang mungkin harus diinstal dan dibutuhkan ekspresi reguler sebagai argumen.
Ah, saya tidak menyadarinya. Saya akan memberikan penghargaan untuk jawaban kanonik, ketika saya mengidentifikasinya :)
Internet man
5
renameProgram ini berasal dari distribusi contoh Perl. Debian dan Ubuntu mengirimkannya sebagai /usr/bin/rename. Varian Unix lain mungkin tidak menyediakannya, atau mungkin memberikan yang sama sekali berbeda /usr/bin/rename.
Gilles
1
Beberapa versi renametake a from to replacement pattern:rename [options] <expression> <replacement> <file>...
melds
1
Jika Anda menggunakan sistem berbasis Debian maka sudo apt-get install rename, maka Anda dapat menggunakan perintah rename. Itu sed untuk nama file.
ctrl-alt-delor
41
zmv
Shell zsh memiliki perintah mengubah nama bets kuat yang disebut zmv.
Pertama, Anda perlu mengaktifkan zmvperintah sebagai berikut (ini bisa masuk ke Anda ~/.zshrc).
autoload zmv
Sintaks dasarnya adalah zmv PATTERN REPLACEMENT. Polanya adalah ekspresi shell glob. Bagian dari pola dapat dikelilingi oleh tanda kurung. Teks pengganti dapat berisi $1,, $2dll. Untuk merujuk ke grup kurung ke-N dalam pola. Sebagai contoh:
zmv 'image(*.png)''$1'
Anda juga dapat meminta zsh untuk secara otomatis menentukan $1, $2, dll untuk mencocokkan karakter wildcard dalam pola:
sweeeeeeeeeeeeeeeeeet. Belum alasan lain saya harus belajar zsh.
ixtmixilix
1
@ixtmixilix apa yang harus dipelajari? Mulailah menggunakannya dan mungkin tambahkan prezto ( github.com/sorin-ionescu/prezto ) untuk beberapa keangkeran ekstra.
Gerry
Benar-benar keren, seperti yang ditunjukkan pada pria zmv, ini dapat disederhanakan dengan menambahkan alias mmv = 'noglob zmv -W' ke: mmv * .c.orig orig / *. C
Bretsko
Mengaktifkan zmvprezto membutuhkan tanda komentar pada baris di ~ / .zpreztorc Anda setelah # Set the Zsh functions to load (man zshcontrib).pemberianzstyle ':prezto:load' zfunction 'zargs' 'zmv'
33
Saya biasanya menggunakan utilitas mmv ( halaman manual ) yang bagus dan sederhana untuk penggunaan ini:
$ mmv "image*.png""#1.png"
akan melakukan tugas Anda.
The #1dalam pola target akan diganti dengan apa pun sesuai dengan wildcard dalam pola sumber. Ini juga berfungsi untuk beberapa wildcard dan dapat digunakan misalnya untuk mengubah urutan bagian nama file. Anda juga dapat dengan mudah melakukan hal-hal yang lebih rumit seperti mengubah huruf kecil menjadi huruf besar.
Pastikan untuk melindungi pola dari cangkang dengan mengutip.
Terima kasih telah menunjukkan utilitas ini. Saya menemukannya di repositori Debian, Ubuntu dan Cygwin. Saya mengalami masalah dengan halaman manual, tetapi menemukan beberapa halaman web dan pertanyaan Stack Overflow ini yang membantu menjelaskan bagaimana Anda menggunakannya. stackoverflow.com/questions/417916/how-to-do-a-mass-rename
W_Whalley
Terima kasih, saya menambahkan beberapa informasi pada jawaban untuk membuatnya lebih jelas.
Marcel Stimberg
3
Tidak bisa cukup mengunggahnya! Ini sangat sederhana dan ramah. Tersedia untuk OS X di homebrew.
Greg Dubicki
9
POSIX sh untuk loop
Menggunakan sed untuk mengganti nama
for i in image*jpgdo
mv -v "$i""$(echo "$i" | sed -e 's/^\.\/image//' - )"done
Perintah qmvdari renameutilsmembuka editor yang memperlihatkan daftar nama file dengan dua kolom, dipisahkan oleh tab. Setiap baris menunjukkan salah satu nama file, sama di kedua kolom. Kolom kanan mewakili nama-nama baru file.
Untuk melakukan perubahan, edit nama di sisi kanan. Dalam contoh ini, :%s/...atau mode blok visual sangat membantu.
Coba brename ( https://github.com/shenwei356/brename ), alat baris perintah lintas platform praktis untuk menamai ulang file / direktori dengan aman melalui ekspresi reguler (mendukung Windows, Linux dan OS X).
Linux memiliki berbagai opsi penggantian nama file batch, tetapi saya tidak melihat adanya kekurangan dalam brename yang muncul pada saya.
Fitur:
Lintas-platform . Mendukung Windows, Mac OS X dan Linux.
Aman . Dengan memeriksa potensi konflik dan kesalahan .
Pemfilteran file . Mendukung termasuk dan tidak termasuk file melalui ekspresi reguler. Tidak perlu menjalankan perintah seperti find ./ -name "*.html" -exec CMD.
Mengganti nama pengiriman dengan nilai yang sesuai melalui file nilai kunci .
Mengganti nama melalui ascending integer .
Mengubah nama file dan direktori secara rekursif .
Mendukung dry run .
Output berwarna-warni .
Perintah:
$ brename -f .png -p image[INFO] checking:[ ok ]'image0001.png'->'0001.png'[INFO] checking:[ ok ]'image0002.png'->'0002.png'[INFO] checking:[ ok ]'image0003.png'->'0003.png'[INFO]3 path(s) to be renamed[INFO] renamed:'image0001.png'->'0001.png'[INFO] renamed:'image0002.png'->'0002.png'[INFO] renamed:'image0003.png'->'0003.png'[INFO]3 path(s) renamed
Sesuatu yang tidak beres: "mv: operan file tujuan hilang setelah 'image0001.png'"
Internet man
3
Ada banyak masalah dengan kode Anda. Mengurai output lshanya memanggil masalah. readseharusnya read -r. semua penggantian variabel harus dalam tanda kutip ganda.
Gilles
Anda dapat menulis ini dengan lebih efektif for f in *png; do f2="$(echo "$f" | sed -e 's/image//')"; mv "$f" "$f2"; done. Parsing lstidak perlu atau bukan ide yang baik .
thunar -B *.png
alat gui massal-ganti thunar.Jawaban:
Jika Anda menggunakan Bash atau shell yang kompatibel dengan POSIX:
sumber
Pada Debian dan turunannya,
rename
karya Perl miripsed
seperti ini:Ada juga
rename
dariutil-linux
yang bekerja seperti ini, sebagai gantinya:sumber
rename
Program ini berasal dari distribusi contoh Perl. Debian dan Ubuntu mengirimkannya sebagai/usr/bin/rename
. Varian Unix lain mungkin tidak menyediakannya, atau mungkin memberikan yang sama sekali berbeda/usr/bin/rename
.rename
take a from to replacement pattern:rename [options] <expression> <replacement> <file>...
zmv
Shell zsh memiliki perintah mengubah nama bets kuat yang disebut
zmv
.Pertama, Anda perlu mengaktifkan
zmv
perintah sebagai berikut (ini bisa masuk ke Anda~/.zshrc
).Sintaks dasarnya adalah
zmv PATTERN REPLACEMENT
. Polanya adalah ekspresi shell glob. Bagian dari pola dapat dikelilingi oleh tanda kurung. Teks pengganti dapat berisi$1
,,$2
dll. Untuk merujuk ke grup kurung ke-N dalam pola. Sebagai contoh:Anda juga dapat meminta zsh untuk secara otomatis menentukan
$1
,$2
, dll untuk mencocokkan karakter wildcard dalam pola:sumber
zmv
prezto membutuhkan tanda komentar pada baris di ~ / .zpreztorc Anda setelah# Set the Zsh functions to load (man zshcontrib).
pemberianzstyle ':prezto:load' zfunction 'zargs' 'zmv'
Saya biasanya menggunakan utilitas mmv ( halaman manual ) yang bagus dan sederhana untuk penggunaan ini:
akan melakukan tugas Anda.
The
#1
dalam pola target akan diganti dengan apa pun sesuai dengan wildcard dalam pola sumber. Ini juga berfungsi untuk beberapa wildcard dan dapat digunakan misalnya untuk mengubah urutan bagian nama file. Anda juga dapat dengan mudah melakukan hal-hal yang lebih rumit seperti mengubah huruf kecil menjadi huruf besar.Pastikan untuk melindungi pola dari cangkang dengan mengutip.
sumber
POSIX sh untuk loop
Menggunakan sed untuk mengganti nama
sumber
Saya suka Perl:
Anda juga dapat menggunakan pola yang sama untuk tugas-tugas lain seperti menyalin file ke direktori lain:
sumber
rename($old,$_)
qmv
Perintah
qmv
darirenameutils
membuka editor yang memperlihatkan daftar nama file dengan dua kolom, dipisahkan oleh tab. Setiap baris menunjukkan salah satu nama file, sama di kedua kolom. Kolom kanan mewakili nama-nama baru file.Untuk melakukan perubahan, edit nama di sisi kanan. Dalam contoh ini,
:%s/...
atau mode blok visual sangat membantu.Nama file di editor Anda
Dalam editor:
Edit nama di kolom kanan:
(Menghapus
image
awalan dari semua baris menggunakan mode blok visual)Log penamaan ulang:
(misalnya Ubuntu:
apt-get install renameutils
)sumber
rekursif
mudah berulang memilih file gambar * png, dan mengasumsikan tidak perlu berurusan dengan baris baru dalam nama file
Aman, dapat menangani spasi, garis baru, garis miring terbalik, dan apa pun yang lain :
sumber
POSIX sh menggunakan loop sementara
Membaca nama dari
find
perintah.Membaca nama dari file
sumber
Menggunakan ekspansi brace shell :
sumber
Untuk Windows dan linux , skrip Perl ini akan berfungsi; pada kasus ini:
Script dapat dijalankan secara rekursif di bawah direktori dan bahkan menambahkan hitungan ke semuanya:
Karakter UTF-8 juga diperlakukan dengan benar, baik di Windows maupun linux.
sumber
Anda dapat menggunakan alat ini: rnm ( halaman web )
Untuk kasus Anda, perintahnya adalah:
Anda dapat menemukan lebih banyak contoh / dokumen di sini .
sumber
Coba brename ( https://github.com/shenwei356/brename ), alat baris perintah lintas platform praktis untuk menamai ulang file / direktori dengan aman melalui ekspresi reguler (mendukung Windows, Linux dan OS X).
@patrickDurusau berkata:
Fitur:
find ./ -name "*.html" -exec CMD
.Perintah:
sumber
ls * png | saat membaca -rf; do f2 = "` echo $ f | sed -e's / image // '`"; mv $ f $ f2; Selesai
sumber
ls
hanya memanggil masalah.read
seharusnyaread -r
. semua penggantian variabel harus dalam tanda kutip ganda.for f in *png; do f2="$(echo "$f" | sed -e 's/image//')"; mv "$f" "$f2"; done
. Parsingls
tidak perlu atau bukan ide yang baik .