Saya memiliki banyak file dengan .abc
ekstensi dan ingin mengubahnya ke .edefg
Bagaimana melakukan ini dari baris perintah?
Saya memiliki folder root dengan banyak sub-folder, jadi solusinya harus bekerja secara rekursif.
command-line
bash
rename
batch-rename
tommyk
sumber
sumber
Jawaban:
Cara portabel (yang akan bekerja pada sistem yang mendukung POSIX):
Di bash4, Anda dapat menggunakan globstar untuk mendapatkan gumpalan rekursif (**):
Perintah (perl)
rename
di Ubuntu dapat mengganti nama file menggunakan sintaks ekspresi reguler perl, yang dapat Anda gabungkan dengan globstar ataufind
:Juga lihat http://mywiki.wooledge.org/BashFAQ/030
sumber
"${1%.abc}"
meluas ke nilai$1
kecuali tanpa.abc
di akhir. Lihat faq 100 untuk informasi lebih lanjut tentang manipulasi string shell.${1%.abc}...
sh -c
argumen pertama ditugaskan ke $ 0 dan argumen yang tersisa ditugaskan ke parameter posisi . Jadi_
argumen dummy, dan '{}' adalah argumen posisi pertamash -c
.Ini akan melakukan tugas yang diperlukan jika semua file ada di folder yang sama
Untuk mengganti nama file secara rekursif, gunakan ini:
sumber
rename 's/.abc$/.edefg/' /path/to/root/folder/**/*.abc
dalam versi modern Bash.s
di awal, dan opsi apa yang bisa saya gunakan di sana. Terima kasih!Satu masalah dengan pengubahan nama rekursif adalah bahwa metode apa pun yang Anda gunakan untuk mencari file, ia meneruskan seluruh path
rename
, bukan hanya nama file. Itu membuatnya sulit untuk melakukan penggantian nama yang kompleks di folder bersarang.Saya menggunakan
find
's-execdir
tindakan untuk memecahkan masalah ini. Jika Anda menggunakan-execdir
alih-alih-exec
, perintah yang ditentukan dijalankan dari subdirektori yang berisi file yang cocok. Jadi, alih-alih melewati seluruh jalan menujurename
, itu hanya melewati./filename
. Itu membuatnya lebih mudah untuk menulis regex.Secara terperinci:
-type f
berarti hanya mencari file, bukan direktori-name '*.abc'
berarti hanya cocok dengan nama file yang berakhiran .abc'{}'
adalah placeholder yang menandai tempat di mana-execdir
akan memasukkan jalan yang ditemukan. Kutipan tunggal diperlukan, untuk memungkinkannya menangani nama file dengan spasi dan karakter shell.-type
dan-name
adalah karakter lanjutan garis bash. Saya menggunakannya untuk membuat contoh ini lebih mudah dibaca, tetapi mereka tidak diperlukan jika Anda menempatkan perintah Anda semua pada satu baris.-execdir
baris diperlukan. Itu ada untuk melarikan diri dari titik koma, yang mengakhiri perintah dijalankan oleh-execdir
. Menyenangkan!Penjelasan regex:
s/
mulai dari regex\.\/
cocok dengan yang terdepan ./ yang -execdir lewati. Gunakan \ untuk menghindari. dan / metakarakter (catatan: bagian ini bervariasi tergantung pada versi Andafind
. Lihat komentar dari pengguna @apollo)(.+)
cocok dengan nama file. Tanda kurung menangkap pertandingan untuk digunakan nanti\.abc
lepas titik, cocok dengan abc$
jangkar korek api di ujung senar/
menandai akhir bagian "cocok" dari regex, dan awal bagian "ganti"version1_
tambahkan teks ini ke setiap nama file$1
referensi nama file yang ada, karena kami menangkapnya dengan tanda kurung. Jika Anda menggunakan beberapa set tanda kurung di bagian "cocok", Anda dapat merujuknya di sini menggunakan $ 2, $ 3, dll..abc
nama file baru akan berakhiran .abc. Tidak perlu keluar dari metacharacter titik di sini di bagian "ganti"/
akhir regexSebelum
Setelah
Petunjuk:
rename
opsi -n berguna. Itu menjalankan kering dan menunjukkan kepada Anda apa nama itu akan berubah, tetapi tidak membuat perubahan.sumber
--execdir
tidak lulus dalam memimpin./
sehingga\.\/
bagian dalam regex dapat dihilangkan. Mungkin itu karena saya menggunakan OSX bukan ubuntuCara portabel lainnya:
sumber
Lihat juga entri tentang mengapa Anda tidak perlu menguraikan
ls
.Sunting: jika Anda harus menggunakan nama samaran, sintaks Anda adalah:
https://unix.stackexchange.com/questions/19654/changing-extension-to-multiple-files
sumber
Inilah yang saya lakukan dan bekerja persis seperti yang saya inginkan. Saya menggunakan
mv
perintah. Saya memiliki banyak.3gp
file dan saya ingin mengubah nama semuanya.mp4
Berikut adalah daftar singkat untuk itu:
Yang cukup memindai melalui direktori saat ini, mengambil semua file .3gp, lalu mengganti nama (menggunakan mv) ke
ren-name_of_file.mp4
sumber
file.3gp
menjadifile.3gp.mp4
, yang mungkin bukan yang diinginkan kebanyakan orang..3gp
atau.mp4
di sini hanya untuk tujuan ilustrasi.basename "$i" .mp4
untuk menghapus ekstensi sebelumnya, bukan "ren- $ i.mp4".Saya menemukan cara mudah untuk mencapai ini. Untuk mengubah ekstensi banyak file dari jpg ke pdf, gunakan:
sumber
Saya akan menggunakan perintah mmv dari paket dengan nama yang sama :
The
;
pertandingan nol atau lebih*/
dan sesuai dengan#1
di penggantian. The*
bersesuaian untuk#2
. Versi non-rekursif akan menjadisumber
Ganti nama file dan direktori dengan
find -execdir | rename
Jika Anda akan mengubah nama file dan direktori tidak hanya dengan akhiran, maka ini adalah pola yang baik:
-execdir
Opsi yang luar biasa melakukan acd
ke dalam direktori sebelum mengeksekusirename
perintah, tidak seperti-exec
.-depth
memastikan bahwa penggantian nama terjadi pertama kali pada anak-anak, dan kemudian pada orang tua, untuk mencegah kemungkinan masalah dengan direktori orang tua yang hilang.-execdir
diperlukan karena penggantian nama tidak berfungsi dengan baik dengan jalur input non-basename, misalnya yang gagal berikut:The
PATH
hacking diperlukan karena-execdir
memiliki satu kelemahan yang sangat mengganggu:find
yang sangat dogmatis dan menolak untuk melakukan apa saja dengan-execdir
jika Anda memiliki path relatif di AndaPATH
variabel lingkungan, misalnya./node_modules/.bin
, gagal dengan:Lihat juga: Mengapa menggunakan tindakan '-execdir' tidak aman untuk direktori yang ada di PATH?
-execdir
adalah ekstensi menemukan GNU ke POSIX .rename
berbasis Perl dan berasal darirename
paket. Diuji di Ubuntu 18.10.Ganti nama lookahead workaround
Jika jalur input Anda tidak berasal
find
, atau jika Anda sudah cukup mengalami gangguan jalur relatif, kita dapat menggunakan beberapa Perl lookahead untuk mengganti nama direktori dengan aman seperti di:Saya belum menemukan analog yang cocok untuk
-execdir
denganxargs
: https://superuser.com/questions/893890/xargs-change-working-directory-to-file-path-before-executing/915686The
sort -r
diperlukan untuk memastikan bahwa file datang setelah direktori masing-masing, karena jalur lagi datang setelah yang lebih pendek dengan awalan yang sama.sumber