Jadikan direktori bernama 0001, bukan 1 dalam loop skrip bash

10

Dalam skrip bash berikut jika j = 0000 bagaimana saya harus mengubah skrip bash berikut untuk membuat dirs bernama 0001, 0002, ...? Sebenarnya itu membuat dir bernama 1, 2, 3

for i in *.jpg; do let j+=1 ; mkdir $j ; done

Terima kasih!

Marcello
sumber

Jawaban:

13

Script Anda saat ini hanya menggunakan nilai desimal - ini jelas diterjemahkan ke nilai tanpa memimpin nol.

Anda harus mengisi string dengan panjang 4 karakter, dengan angka nol di depannya. Anda melakukan ini dengan menggunakan backticks ``untuk mendapatkan hasil panggilan printf printf %04d $j.

Akibatnya, Anda harus memiliki perintah penuh:

for i in *.jpg; do let j+=1; mkdir `printf %04d $j`; done

Sumber: StackOverflow: bash - Padding nol dalam sebuah string

(Jelas juga lihat jawaban lebih lanjut untuk pertanyaan itu, jika Anda menginginkan solusi yang lebih mendalam, tetapi ini jelas bekerja dengan sempurna untuk use case ini.)

pengguna98085
sumber
5

Menggunakan bash, opsi terbaik Anda adalah:

mkdir {0001..0666}

untuk membuat dir dengan nama 0001ke 0666(dengan bantalan nol).

Jika Anda ingin direktori bernama prefix0001suffix, prefix0002suffix, ... maka:

mkdir prefix{0001..0666}suffix

akan melakukan.

Jika Anda hanya ingin nama direktori nomor ganjil

mkdir {0001..0666..2}

dan seterusnya ... Lihat Brace Expansion dalam bashmanual referensi .

Seperti yang ditunjukkan oleh FEichinger, Anda harus mengetahui terlebih dahulu jumlah direktori. Jika Anda menginginkan solusi yang dekat dengan Anda, tetapi benar-benar aman dan menggunakan idiom bash yang lebih modern:

for i in *.jpg; do ((++j)); mkdir $(printf "%04d" $j) ; done
gniourf_gniourf
sumber
Ini hanya berguna untuk jumlah direktori yang diketahui sebelumnya dibuat. Biasanya, ketika menggunakan direktori bernomor, Anda berada dalam konteks dinamis - yang berarti harus menentukan jumlah saat runtime dan dengan demikian masih membutuhkan string padding. Tergantung pada kasus penggunaan khusus.
user98085
@FEichinger Benar! pos diedit sesuai.
gniourf_gniourf