Saya ingin mengubah nama file dalam direktori menjadi nomor urut. Berdasarkan tanggal pembuatan file.
Misalnya sadf.jpg
untuk 0001.jpg
, wrjr3.jpg
untuk 0002.jpg
dan sebagainya, jumlah nol terkemuka tergantung pada jumlah total file (tidak perlu untuk nol tambahan jika tidak diperlukan).
bash
rename
batch-rename
Gnutt
sumber
sumber
Jawaban:
Coba gunakan loop
let
,, danprintf
untuk padding:menggunakan
-i
bendera mencegah secara otomatis menimpa file yang ada.sumber
printf -v new "%04d.jpg" ${a}
untuk memasukkan nilai ke dalam variabel. Dan((a++))
berfungsi untuk meningkatkan variabel. Juga, ini tidak melakukannya dalam urutan tanggal pembuatan atau meminimalkan bantalan yang ditentukan OP. Namun, perlu dicatat bahwa Linux / Unix tidak menyimpan tanggal pembuatan.mv -- "$i" "$new"
dengan benar menangani nama file sumber yang dimulai dengan tanda hubung; apa adanya,mv
akan mencoba mengurai nama file seperti koleksi bendera.-i
harus dimasukkan dalam jawaban dan catatan harus ditulis ulang sesuai. itu akan lebih aman. :(Kecantikan dalam satu baris:
Anda dapat mengubah
.ext
dengan.png
,.jpg
, dllsumber
ls | cat -n | while read n f; do mv "$f" `printf "%04d.extension" $n`; done
untuk memiliki nol angka empuk-n
perintah mv untuk mencegah menimpa file secara tidak sengaja. Menemukan ini dengan cara yang sulit!ls -1prt | grep -v "/$" | cat -n | while read n f; do mv -n "${f}" "$(printf "%04d" $n).${f#*.}"; done
Hasil: (1) diurutkan dalam urutan modifikasi, file kemudian dengan indeks kemudian; (2) mengabaikan direktori - dan tidak rekursif; (3) indeks bantalan; (4) memelihara ekstensi asli.Saya suka solusi gauteh karena kesederhanaannya, tetapi memiliki kelemahan penting. Saat berjalan di ribuan file, Anda bisa mendapatkan pesan "daftar argumen terlalu panjang" ( lebih lanjut tentang ini ), dan kedua, skrip bisa menjadi sangat lambat. Dalam kasus saya, menjalankannya di sekitar 36.000 file, skrip bergerak kira-kira. satu item per detik! Saya tidak begitu yakin mengapa ini terjadi, tetapi aturan yang saya dapatkan dari rekan adalah "
find
adalah teman Anda" .Untuk menghitung item dan membangun perintah, gawk digunakan. Perhatikan perbedaan utamanya. Secara default
find
mencari file dalam direktori saat ini dan subdirektori, jadi pastikan untuk membatasi pencarian hanya pada direktori saat ini, jika perlu (gunakanman find
untuk melihat caranya).sumber
NR
untuk perintah yang lebih pendek.gawk '{ printf "mv %s %04d.jpg\n", $0, NR }'
$(rm -rf /).jpg
.for
Loop tidak mengambil 1 detik per file, tegasnya. Butuh waktu lama untuk mengambil 36.000 nama file dari sistem file, lalu mengatasinya dengan cepat. Banyak sistem file memiliki masalah dengan direktori besar, terlepas dari perintah tepat yang Anda jalankan; tetapi biasanya,find
akan lebih cepat daripada shell wildcard karena harus mengambil dan mengurutkan daftar file yang cocok.dengan perintah "rename"
atau
sumber
rename
(Linux Mint 13) tidak memiliki-N
opsi.rename
perintah itu, tetapi saya tidak pernah tahu-N
! Terima kasih!rename
. Tautan yang diposting oleh @Bostrot adalah alat ganti nama lain dan sepertinya @RomanRhrnNesterov menggunakan yang itu. ¶ Untuk semua penggunarename
oleh Peder Stray dan Larry Wall (paketperl-rename
di linux arch dan paketrename
di debian / ubuntu): Anda dapat mendefinisikan$N
diri Anda:perl-rename '$N=sprintf("%04d",++$N); s/.*/$N.jpg/' *.jpg
menggunakan solusi Pero di OSX diperlukan beberapa modifikasi. Saya menggunakan:
Catatan: garis miring terbalik ada untuk kelanjutan garis
sunting 20 Juli 2015: memasukkan umpan balik @ klaustopher untuk mengutip
\"%s\"
argumen darimv
perintah untuk mendukung nama file dengan spasi.sumber
$(rm -rf /).jpg
.mv
. Jika Anda memiliki file bernama iesome thing.jpg
skrip Anda gagal. Inilah yang saya gunakan:find . -name '*.jpg' | awk 'BEGIN{ a=0 }{ printf "mv \"%s"\ wallpaper-%04d.jpg\n", $0, a++ }' | bash
-maxdepth 1
untuk bekerja hanya pada jpg di direktori saat ini, karena lebih baik aman daripada menyesal.ls -1 *.jpg
daripada menemukan, kalau tidak itu tidak akan diurutkan. Atau tambahkan|sort|
awk sebelumBash one liner yang sangat sederhana yang menjaga ekstensi asli, menambahkan nol di depan, dan juga berfungsi di OSX:
Versi sederhana dari http://ubuntuforums.org/showthread.php?t=1355021
sumber
9.ext
sebelumnya11.ext
, tetapi alat lain (sepertils
) tidak akan melakukannya juga.Untuk bekerja dalam semua situasi, beri \ "untuk file yang memiliki ruang dalam nama
sumber
$(rm -rf /)
masih dihormati.Jika Anda
rename
tidak mendukung-N
, Anda dapat melakukan sesuatu seperti ini:Sunting Untuk mulai dengan angka yang diberikan, Anda dapat menggunakan kode (agak jelek) di bawah ini, cukup ganti 123 dengan nomor yang Anda inginkan:
Ini mencantumkan file dalam urutan waktu pembuatan (terbaru lebih dulu, tambahkan
-r
ke ls untuk membalikkan urutan), kemudian mengirimkan daftar file ini untuk mengganti nama. Ganti nama menggunakan kode perl di regex untuk memformat dan menambah penghitung.Namun, jika Anda berurusan dengan gambar JPEG dengan informasi EXIF, saya akan merekomendasikan
exiftool
Ini dari dokumentasi exiftool , di bawah "Mengganti Nama Contoh"
sumber
rename
?Di OSX , instal skrip rename dari Homebrew:
Maka Anda dapat melakukannya dengan sangat mudah:
Atau untuk menambahkan awalan yang bagus:
sumber
Global symbol "$N" requires explicit package name (did you forget to declare "my $N"?) at (user-supplied code).
Ikuti perintah, ganti nama semua file menjadi berurutan dan juga ekstensi huruf kecil:
sumber
Saya memiliki masalah yang sama dan menulis skrip shell karena alasan itu. Saya telah memutuskan untuk mempostingnya terlepas bahwa banyak jawaban yang baik telah diposting karena saya pikir itu dapat membantu seseorang. Jangan ragu untuk memperbaikinya!
menghitung
@Gnutt Perilaku yang Anda inginkan dapat dicapai dengan mengetik berikut ini:
Jika opsi
-r
ini ditinggalkan, reaming hanya akan disimulasikan (Harus membantu untuk pengujian).The otion L menjelaskan panjang nomor target (yang akan diisi dengan angka nol di depannya) juga memungkinkan untuk menambahkan awalan / akhiran dengan opsi
-p <prefix>
-s <suffix>
.Jika seseorang ingin file diurutkan secara numerik sebelum diberi nomor, cukup hapus
-o modtime
opsi.sumber
sumber
Mari kita asumsikan kita memiliki file-file ini dalam direktori, terdaftar dalam urutan pembuatan, yang pertama adalah yang tertua:
kemudian
ls -1cr
menampilkan persis daftar di atas. Anda kemudian dapat menggunakanrename
:output yang mana
Peringatan "penggunaan nilai yang tidak diinisialisasi [...]" ditampilkan untuk file tanpa ekstensi; Anda bisa mengabaikannya.
Hapus
-n
darirename
perintah untuk benar-benar menerapkan penggantian nama.Jawaban ini terinspirasi oleh jawaban Luke pada April 2014 . Ini mengabaikan persyaratan Gnutt untuk mengatur jumlah nol terkemuka tergantung pada jumlah total file.
sumber
ls -1tU
waktu pembuatan. Itu juga perlurename
diinstal, yang saya tidak punya.Sekali lagi menggunakan solusi Pero dengan sedikit memodifikasi, karena
find
akan melintasi pohon direktori dalam item pesanan disimpan dalam entri direktori. Ini (sebagian besar) akan konsisten dari menjalankan ke menjalankan, pada mesin yang sama dan pada dasarnya akan menjadi "urutan pembuatan file / direktori" jika belum ada penghapusan.Namun, dalam beberapa kasus Anda perlu mendapatkan beberapa urutan logis, katakanlah, dengan nama, yang digunakan dalam contoh ini.
sumber
blahblah; rm -r * blahblah.jpg
?Diurutkan berdasarkan waktu, terbatas pada jpg, nol terkemuka dan nama bas (jika Anda menginginkannya):
(semua dalam satu baris, tanpa
\
)sumber
ls
skrip.rename -vn - hapus n untuk mode uji off
{$ i = 1;} - kontrol nomor awal
"% 04d.jpg" - kontrol hitung nol 04 dan atur ekstensi keluaran .jpg
sumber
rename -v -n 's/../our $i;if(!$i){$i=1;} sprintf("%02d", $i++)/e' *
Bagi saya kombinasi jawaban ini bekerja dengan sempurna:
ls -v
membantu memesan 1 10 9 dengan benar: 1 9 10 pesanan, menghindari masalah ekstensi nama file dengan jpg JPG jpeggawk 'BEGIN{ a=1 }{ printf "mv %s %04d.jpg\n", $0, a++ }'
nomor baru dengan 4 karakter dan angka nol di depan. Dengan menghindari mv saya tidak sengaja mencoba menimpa apa pun yang sudah ada dengan tidak sengaja memiliki nomor yang sama.bash
mengeksekusiWaspadai apa yang dikatakan @xhienne, mem-pipkan konten yang tidak dikenal ke bash adalah risiko keamanan. Tapi ini tidak terjadi pada saya karena saya menggunakan foto yang dipindai.
sumber
Anda juga dapat menggunakan ls
sumber
blahblah; rm -r * blahblah.JPG
?Sebagian besar solusi lain akan menimpa file yang sudah ada yang dinamai sebagai angka. Ini khususnya masalah jika menjalankan skrip, menambahkan lebih banyak file, dan kemudian menjalankan skrip lagi.
Skrip ini mengganti nama file numerik yang ada terlebih dahulu:
sumber
Oneliner ini mencantumkan semua file di direktori saat ini, mengurutkan berdasarkan cap waktu pembuatan dalam urutan terbalik (berarti file terlama ada di awal) dan mengganti nama secara otomatis dengan trailing nol seperti yang dipersyaratkan oleh jumlah file. Ekstensi file akan dipertahankan.
Saya biasanya hanya memiliki satu folder sejak bertahun-tahun untuk gambar dan film ponsel. Menerapkan perintah ini, gambar dan film saya siap untuk tayangan slide dalam urutan yang benar di tv atau pengarsipan juga.
Perlu diketahui bahwa jika Anda memiliki tabrakan nama file, Anda kehilangan file. Jadi pertama ganti nama menjadi sesuatu yang aneh seperti
temp001.jpg
dan kemudian jalankan ke nama file akhir Anda.sumber
ls
tidak hanya sekali tetapi dua kali sepertinya ini sebaiknya dihindari, tetapi saya belum mempelajarinya secara mendalam.ls
, jadi itu sebabnya dua dari mereka diperlukan. 3. Perintah semacam itu adalah satu tembakan dan tidak dimaksudkan untuk dimasukkan dalam skrip, jadi ada alasan mengapa orang lebih suka satu kalimatInilah yang bekerja untuk saya.
Saya telah menggunakan perintah rename sehingga jika ada file yang mengandung spasi dalam nama itu, perintah mv jangan bingung antara spasi dan file aktual.
sumber
Saat ini ada opsi setelah Anda memilih beberapa file untuk penggantian nama (saya telah melihat di file manager thunar).
Prompt datang dengan semua file di dir tertentu hanya memeriksa dengan bagian kategori
sumber
Script ini akan mengurutkan file berdasarkan tanggal pembuatan di bash Mac OS. Saya menggunakannya untuk mengubah nama video secara massal. Cukup ganti ekstensi dan bagian pertama nama.
sumber
blahblah; rm -r * blahblah.mp4
?Di sini solusi lain dengan perintah "rename":
sumber
rename 's/(\d+)/sprintf("%04d",$1)+1/ge'
Jawaban Pero membuat saya di sini :)
Saya ingin mengganti nama file relatif ke waktu karena pemirsa gambar tidak menampilkan gambar dalam urutan waktu.
sumber
blahblah; rm -r * blahblah.jpg
? Hanya contoh ekstrem.Jika Anda menggunakan Annotator gambar untuk memberi label pada gambar.
$ make qt5py3
$ python3 labelImg.py
sumber
Untuk memberi nomor baru 6000, file dalam satu folder Anda dapat menggunakan opsi 'Ubah nama' dari program ACDsee.
Untuk mendefinisikan awalan, gunakan format ini:
####"*"
Kemudian atur nomor mulai dan tekan Ubah Nama dan program akan mengganti nama semua 6000 file dengan nomor urut.
sumber