Ada beberapa file dalam direktori yang dimulai dengan awalan fgh
, misalnya:
fghfilea
fghfileb
fghfilec
Saya ingin mengubah nama semuanya menjadi awalan jkl
. Apakah ada satu perintah untuk melakukan itu daripada mengganti nama setiap file satu per satu?
file
unix
rename
batch-rename
jww
sumber
sumber
Jawaban:
Ada beberapa cara, tetapi menggunakan
rename
mungkin akan menjadi yang paling mudah.Menggunakan satu versi
rename
:Menggunakan versi lain
rename
(sama dengan jawaban Judy2K ):Anda harus memeriksa halaman manual platform Anda untuk melihat mana dari yang berlaku di atas.
sumber
rename
maka Anda menunjukkan sintaks untuk unixhelp.ed.ac.uk/CGI/man-cgi?rename adalah yang lainrename
tampaknya merupakan skrip atau utilitas khusus Linux. Jika Anda sama sekali peduli tentang portabilitas, silakan terus menggunakansed
dan loop atau skrip Perl inline.brew install rename
pada OS X :)Ini adalah bagaimana
sed
danmv
dapat digunakan bersama untuk melakukan rename:Seperti komentar di bawah ini, jika nama file memiliki spasi di dalamnya, tanda kutip mungkin perlu mengelilingi sub-fungsi yang mengembalikan nama untuk memindahkan file ke:
sumber
for f in fgh*; do mv "$f" "$(echo $f | sed 's/^fgh/jkl/g')"; done
touch fghfilea fghfileb fghfilec fghfile\ d
. Saya sarankan untuk mempertimbangkan komentar @DaveNelson.mengganti nama mungkin tidak ada di setiap sistem. jadi jika Anda tidak memilikinya, gunakan shell contoh ini di bash shell
sumber
sed
perintah tidak diperlukan. Yang ini lebih sederhana dari jawaban @ nik.sh
atau umumnya di shell lain.Menggunakan mmv :
sumber
;
bersama#1
. contoh:mmv ";fgh*" "#1jkl#2"
Ada banyak cara untuk melakukannya (tidak semua ini akan bekerja pada semua sistem unixy):
ls | cut -c4- | xargs -I§ mv fgh§ jkl§
§ dapat diganti dengan apa pun yang Anda rasa nyaman. Anda dapat melakukan ini dengan
find -exec
terlalu tetapi itu berperilaku agak berbeda pada banyak sistem, jadi saya biasanya menghindarinyafor f in fgh*; do mv "$f" "${f/fgh/jkl}";done
Mentah tetapi efektif seperti yang mereka katakan
rename 's/^fgh/jkl/' fgh*
Cukup cantik, tetapi penggantian nama tidak ada pada BSD, yang merupakan sistem unix yang paling umum.
rename fgh jkl fgh*
ls | perl -ne 'chomp; next unless -e; $o = $_; s/fgh/jkl/; next if -e; rename $o, $_';
Jika Anda bersikeras menggunakan Perl, tetapi tidak ada mengganti nama pada sistem Anda, Anda dapat menggunakan monster ini.
Beberapa di antaranya agak berbelit-belit dan daftarnya jauh dari lengkap, tetapi Anda akan menemukan apa yang Anda inginkan di sini untuk hampir semua sistem unix.
sumber
ls
output tidak boleh diuraikan dan / atau disalurkansumber
Menggunakan
find
,xargs
dansed
:Ini lebih kompleks daripada solusi @ nik tetapi memungkinkan untuk mengubah nama file secara rekursif. Misalnya, struktur,
akan diubah menjadi ini,
Kunci untuk membuatnya bekerja
xargs
adalah dengan memanggil shell dari xargs .sumber
Untuk menginstal skrip rename Perl :
Ada dua nama seperti yang disebutkan dalam komentar dalam jawaban Stephan202. Distro berbasis Debian memiliki nama Perl . Redhat / rpm distro memiliki C rename .
OS X tidak memiliki satu yang diinstal secara default (setidaknya dalam 10.8), begitu pula Windows / Cygwin.
sumber
Berikut cara untuk melakukannya menggunakan Groovy baris perintah:
sumber
Pada Solaris Anda dapat mencoba:
sumber
for file in $(find)
dasarnya cacat dan tidak dapat diperbaiki dengan mengutip. Jikafind
pengembalian./file name with spaces
Anda akan mendapatkanfor
loop di atas./file
,name
,with
, danspaces
dan tidak ada jumlah mengutip dalam loop akan membantu (atau bahkan diperlukan).sumber
Skrip ini berfungsi untuk saya untuk pengubahan nama secara rekursif dengan direktori / nama file yang mungkin mengandung spasi putih:
Perhatikan
sed
ungkapan yang dalam contoh ini menggantikan semua kemunculan;
dengan spasi. Ini tentu saja harus diganti sesuai dengan kebutuhan spesifik.
sumber
Menggunakan alat StringSolver (windows & Linux bash) yang memproses dengan contoh:
Pertama menghitung filter berdasarkan contoh , di mana input adalah nama file dan output (ok dan notok, string sewenang-wenang). Jika filter memiliki opsi --auto atau dipanggil sendiri setelah perintah ini, itu akan membuat folder
ok
dan foldernotok
dan mendorong file masing-masing ke mereka.Kemudian menggunakan filter,
mv
perintahnya adalah gerakan semi-otomatis yang menjadi otomatis dengan modifier --auto. Menggunakan filter sebelumnya berkat --filter, ia menemukan pemetaan darifghfilea
kejklfilea
dan kemudian menerapkannya pada semua file yang difilter.Solusi satu baris lainnya
Cara lain yang setara untuk melakukan hal yang sama (setiap baris sama), sehingga Anda dapat memilih cara favorit Anda untuk melakukannya.
Solusi multi-langkah
Untuk mengetahui apakah perintahnya berkinerja baik, Anda dapat mengetik berikut ini:
dan ketika Anda yakin bahwa filternya bagus, lakukan langkah pertama:
Jika Anda ingin menguji, dan menggunakan filter sebelumnya, ketik:
Jika transformasi bukan yang Anda inginkan (mis. Walaupun
mv --explain
Anda melihat ada sesuatu yang salah), Anda dapat mengetikmv --clear
untuk memulai ulang file yang bergerak, atau menambahkan lebih banyak contoh dimv input1 input2
mana input1 dan input2 adalah contoh lainSaat Anda percaya diri, ketik saja
dan voila! Semua penggantian nama dilakukan menggunakan filter.
PENOLAKAN: Saya adalah rekan penulis dari karya ini yang dibuat untuk tujuan akademik. Mungkin juga ada fitur penghasil bash segera.
sumber
Jauh lebih mudah (di Mac saya) untuk melakukan ini di Ruby. Berikut adalah 2 contoh:
sumber
Menggunakan renamer :
Hapus
--dry-run
bendera setelah Anda senang hasilnya terlihat benar.sumber
Versi saya mengubah nama file massal:
sumber
Saya akan merekomendasikan menggunakan skrip saya sendiri, yang memecahkan masalah ini. Ia juga memiliki opsi untuk mengubah pengkodean nama file, dan untuk mengkonversi menggabungkan diakritik ke karakter yang dikomposisi, masalah yang selalu saya miliki ketika saya menyalin file dari Mac saya.
sumber
stale over time
Ini bekerja untuk saya menggunakan regexp:
Saya ingin berganti nama file seperti ini:
usig [az | _] + 0 * ([0-9] +. ) regexp di mana ([0-9] +. ) adalah substring grup untuk digunakan pada perintah rename
Menghasilkan:
Contoh lain:
Menghasilkan:
Peringatan, berhati-hatilah.
sumber
Saya menulis skrip ini untuk mencari semua file .mkv secara rekursif mengubah nama file yang ditemukan menjadi .avi. Anda dapat menyesuaikannya dengan kebutuhan Anda. Saya telah menambahkan beberapa hal lain seperti mendapatkan direktori file, ekstensi, nama file dari jalur file hanya jika Anda perlu merujuk ke sesuatu di masa depan.
sumber
Skrip generik untuk menjalankan
sed
ekspresi pada daftar file (menggabungkansed
solusi denganrename
solusi ):Aktifkan dengan memberikan
sed
ekspresi pada skrip , lalu daftar file apa saja, seperti versirename
:sumber
Anda juga dapat menggunakan skrip di bawah ini. sangat mudah dijalankan di terminal ...
// Ganti nama banyak file sekaligus
Contoh:-
sumber
Perluasan parameter lain yang mungkin :
sumber