Saya memiliki sejumlah file:
10.3.100.179_01_20161018_230014_5335.jpg
10.3.100.179_01_20161018_231514_0814.jpg
10.3.100.179_01_20161018_233014_5706.jpg
10.3.100.179_01_20161018_234514_0896.jpg
10.3.100.179_01_20161018_230114_5395.jpg
10.3.100.179_01_20161018_231614_1145.jpg
10.3.100.179_01_20161018_233114_6047.jpg
10.3.100.179_01_20161018_234614_0547.jpg
10.3.100.179_01_20161018_230114_5492.jpg
10.3.100.179_01_20161018_231614_1264.jpg
10.3.100.179_01_20161018_233114_6146.jpg
10.3.100.179_01_20161018_234614_0658.jpg
10.3.100.179_01_20161018_230214_5630.jpg
10.3.100.179_01_20161018_231714_7135.jpg
Saya ingin mengganti nama dengan format ini:
10.4.100.135_01_20161013131108389_TIMING.jpg
10.4.100.135_01_20161013131111390_TIMING.jpg
10.4.100.135_01_20161013131114401_TIMING.jpg
10.4.100.135_01_20161013131117431_TIMING.jpg
10.4.100.135_01_20161013131120418_TIMING.jpg
10.4.100.135_01_20161013131123461_TIMING.jpg
10.4.100.135_01_20161013131126511_TIMING.jpg
Perlu menghapus _
stempel waktu dan menambahkan _TIMING
.
command-line
batch-rename
Jojo Mendoza
sumber
sumber
10.3.100.179
dengan10.4.100.135
. Apakah itu yang Anda inginkan atau Anda hanya ingin menghapus_TIMING
dan_
dari waktu?10.4.100.135_01_2016-10-13T13:11:08.389_TIMING.jpg
(dan "WAKTU" bahkan bisa dihapus, karena sekarang terlihat jelas seperti tanggal dan jam (dan milidetik), terutama ketika standar menjadi lebih luas. T adalah bagian dari standar dan saya tumbuh untuk menyukainya (dan mengeluarkannya merusak standar ^^):
nama file. Saya percaya Windows tidak mendukungnya.Jawaban:
Instal
renameutils
dan gunakanqmv
dengan editor teks favorit Anda.qmv
memuat semua nama di editor Anda dan ketika Anda menyimpan dan menutup itu berlaku perubahan Anda ke file yang sebenarnya. Jika perubahan tidak konsisten (mis. Dua file mendapatkan nama yang sama) itu akan dibatalkan tanpa menyentuh apa pun. Ini juga menangani nama melingkar dengan benar.Saya biasanya melakukan:
sehingga hanya menampilkan satu kolom nama (do: destination-only). Begini tampilannya:
Jika Anda menggabungkannya dengan banyak kursor dari SublimeText, Atom atau Visual Studio Code, itu membuat alat yang sangat bagus dan kuat untuk penggantian nama massal. Misalnya, untuk Atom, Anda akan melakukannya
EDITOR="atom -w" qmv -f do
.sumber
Gunakan
rename
...Dengan
-n
ini akan menampilkan apa yang akan dilakukan tanpa melakukan perubahan:Jika terlihat benar, hapus
-n
Menjelaskan ...
s/something/something_else/
cari dan ganti^
bagian awal nama (anchoring)[0-9]
nomor berapa pun+
satu atau lebih dari karakter sebelumnya\.
literal.
(tanpa\
ini cocok dengan karakter apa pun)()
untuk menjaga bagian ini$1$2$3$3
kembali referensi ke hal-hal yang cocok dan disimpan sebelumnya()
Catatan:
*
di akhir perintah cocok dengan semua file yang terlihat di direktori saat ini. Gunakan glob yang lebih cocok jika perlu.sumber
prename
(p untuk perl, karena arg pertama adalah ekspresi perl)mmv
dapat melakukannya sebagai berikut:# 1, # 2, # 3, ... merujuk masing-masing ke pencocokan '*' di sini.
Bahkan lebih pendek dengan:
sumber
rename
Pendekatan lain :Jika itu berfungsi seperti yang Anda inginkan, hapus
-n
.sumber
Anda juga dapat menggunakan yang berikut ini. Pertama, buat cadangan file Anda dan coba ini:
sed 's/\(.*\)_\(.*\)_/\1\2/')
menghapus_
karakter di cap waktu.Sebagai contoh:
sumber
find -maxdepth 1 -exec rename ... {} +
untuk batch daftar direktori saat ini ke baris perintah rename. (tambahkan-name *.jpg
atau apa pun yang Anda inginkan). Itu akan mengeksekusi lebih cepat daripada loop shell yang fork + execssed
danmv
untuk setiap nama file, bukan hanya mengubah nama system call. (Anda bisa menyingkirkansed
menggunakan barang-barang regex built-in bash, tetapi forkingmv
masih lambat-ish.)Anda mungkin selesai, tetapi inilah solusi (sederhana) semua
bash
:Apakah "sederhana ... solusi bash" sebuah oxymoron?
PS: Logika dalam loop diuji dengan salah satu nama file contoh Anda. Itu berlalu.
sumber
[[ $f ~= (.*)_(.*)_(.*)_(.*)\.jpg ]];
newname=${BASH_REMATCH[1]${BASH_REMATCH:2:4}TIMING.jpg
atau sesuatu. (benar-benar belum teruji dan mungkin salah, tetapi ide umumnya adalah grup tangkap masuk ke array BASH_REMATCH.)bash
) menangkap grup, dan sejujurnya, bash bukan bahasa pertama yang saya coba. (Saya pikirbash
itu bahasa yang jelek.) Namun, itu adalah solusi yang baik dan itu mengajarkan saya sesuatu yang sangat pujian.printf -v "$3" ...
untuk mengatur variabel yang namanya ada$3
.) Membongkar seluruh baris perintah dan meletakkannya kembali bersama-sama cukup sulit untuk mengikuti / debug, setidaknya saya menemukannya seperti itu ketika mencoba untuk membersihkannya / memperbaiki bug. Lihat kode pada githubJika Anda bisa menggunakan GUI, saya akan merekomendasikan pyRenamer .
Ada di sebagian besar distribusi, fi di Ubuntu:
Itu dapat melakukan semua yang Anda inginkan dan banyak lagi.
sumber
Berikut mentah Anda built-in
find
+xargs
+sed
+mv
(oneliners cinta) oneliner:Penjelasan:
find . -name "*.jpg" | sort | xargs sh -c <command> sh
: daftarkan semua JPEG di direktori saat ini kemudian jalankan perintah shell untuk masing-masing (pengurutan adalah opsional tentu saja, tetapi pertahankan sedikit lebih bersih jika Anda masuk ke suatu tempat)-print0
,-z
,-0
: Itu adalah kebiasaan yang baik untuk item terpisah dengan biner0
ketika tokenizing nama file untuk menghindari masalah dengan in-the-middle putih-ruang (tidak kasus Anda meskipun)mv "$filename" $(echo "${filename}" | sed "s/\([0-9]\{8\}\)_\([0-9]\{6\}\)_\([0-9]\{4\}\)/\1\2\3_TIMING/g");
: (Backslashes dised
's regex tidak membantu mudah dibaca, tetapi adalah sederhana) mengubah nama setiap file dengan mengganti urutan garis bawah-separeted dari 8 + 6 + 4 digit dengan Rangkaian berdekatan ditambah ini_TIMING
hal (\i
yang backreference kei
- grup regex).Ref: Xargs - man sed
sumber