Saya memiliki direktori yang berisi file gambar dengan nama suka
image1.jpg
image2.jpg
image3.jpg
...
Sayangnya, nama-nama gambar harus berbasis nol, jadi image1.jpg
seharusnya image0.jpg
, image2.jpg
harus image1.jpg
dan sebagainya.
Saya bisa menulis skrip untuk menghasilkan perintah mv seperti ini, memasukkannya ke dalam skrip shell, dan kemudian menjalankannya -
mv image1.jpg image0.jpg
mv image2.jpg image1.jpg
mv image3.jpg image2.jpg
...
Tapi saya kira ada cara yang lebih rapi untuk melakukannya di Unix. Jadi apa itu?
command-line
rename
Wes
sumber
sumber
for i in $(seq 0 100); do mv image$[i+1].jpg image$i.jpg; done
)imageN.jpg
menjadiimage0.jpg
dan Anda selesai.Jawaban:
Perl tua yang baik mengubah nama:
[Catatan]
Angka gambar harus lebih besar dari 0.
Dalam hal gambar lebih besar dari 9 dan belum memimpin 0s, gunakan
$(ls -v1 *)
untuk menghindari clobbering. Diusulkan oleh @arielf dan diperhatikan oleh @Graeme.Jika ragu gunakan juga
-v
untuk verbose dan-n
tanpa tindakan.sumber
perlreref
0
dalam sumber.*
di akhir dengan`ls -v1 *`
dan Anda akan lebih aman dari musnah. Ini akan berubah dari angka terendah ke tertinggi.Anda dapat menyalurkan
mv
perintah yang dihasilkan kebash
. Jadi Anda tidak perlu menyalinnya dalam skrip dan menjalankannya. Lihat:Dan semuanya akan dieksekusi yang disalurkan ke
bash
.sumber
:)
Memecahkan masalah, jadi +1.Anda dapat beralih pada keluaran ls, ini berfungsi untuk contoh Anda:
Anda harus berada di jalur yang sama dengan file Anda
sumber
-i
atau-n
denganmv
, itu akan mencegah menimpa dalam kasus tepi.sort -V
lebih baik?sort
tidak akan berfungsi, itu akan ditampilkanimage10.jpg
sebelumimage1.jpg
yang mungkin menjadi masalah. Anda perlusort -nk 1.8
seperti pada jawaban @ Graeme.sort -V
adalah ide bagus, akan menambahkannya ke jawaban saya. Mungkin ada kasus tepi lainnya, biasanya saran yang baik untuk menambahkan opsi semacam ini dengan pertanyaan seperti ini jika seseorang menyalin dan akhirnya melakukan beberapa kerusakan.Berikut ini tampaknya berfungsi untuk apa pun yang cocok dengan polanya
imageNUMBER.jpg
. Saya telah menempatkanecho
sebelummv
perintah untuk pertama-tama menunjukkan apa yang akan dilakukan perintah; untuk benar - benar melakukan penggantian nama, cukup hapusecho
Di baris pertama, ini
ls image*.jpg|sort -V
akan menyebabkan file JPG didaftar dengan nomor naik dalam nama file. Thex=
garis ekstrak nomor dari nama file. They=
garis kemudian menurunkan angka per satu. Nama file input dany
nomor kemudian digunakan dalammv
perintah, di mana-i
bendera akan memberi tahu Anda sebelum menimpa file.Untuk pengujian kecil saya sendiri, ini menghasilkan output:
Secara pribadi, saya sarankan mengganti nama menjadi nama file yang lebih berbeda, karena sekarang urutan pemrosesan file dapat membuat perbedaan besar.
sumber
-i
atau-n
denganmv
, itu akan mencegah menimpa dalam kasus tepi.sort -n
,-V
opsi tidak ada.Menggunakan
perl
skripprename
, yang dikaitkan untuk mengganti nama pada distro berbasis Debian, juga membutuhkan GNUfind
/sort
. File diletakkan dalam urutan menaik untuk mencegah penimpaan.Hapus
-n
sekali Anda yakin itu melakukan apa yang Anda inginkan. Akan memperingatkan tentang file yang sudah ada sebelum melakukannya. Namun selama itu menunjukkan file diubah namanya dalam urutan menaik, tidak akan ada konflik saat dijalankan secara nyata.sumber
Dengan
zsh
:(hapus
-n
saat senang).(n)
adalah untuk mengurutkan daftar secara numerik sehinggaimage9.jpg
diubah namanya sebelumnyaimage10.jpg
.sumber