ทำไดเรกทอรีชื่อ 0001 แทน 1 ใน bash script loop


10

ในสคริปต์ทุบตีต่อไปนี้ถ้า j = 0000 ฉันจะเปลี่ยนสคริปต์ทุบตีต่อไปนี้เพื่อทำให้ dirs ชื่อ 0001, 0002, ... ได้อย่างไร? จริงๆแล้วมันทำให้ dirs ชื่อ 1, 2, 3

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

ขอบคุณ!

คำตอบ:


13

สคริปต์ปัจจุบันของคุณใช้เฉพาะค่าทศนิยม - สิ่งนี้แปลได้อย่างชัดเจนว่าไม่มีค่าเลขศูนย์นำหน้า

คุณจะต้องรองสตริงความยาว 4 ตัวอักษรด้วยศูนย์นำ คุณทำเช่นนี้โดยใช้ backticks ที่จะได้รับผลจากการโทร`` printfprintf %04d $j

ดังนั้นคุณควรมีคำสั่งทั้งหมด:

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

แหล่งที่มา: StackOverflow: bash - การเติมศูนย์ในสตริง

(เห็นได้ชัดว่ายังเห็นคำตอบเพิ่มเติมสำหรับคำถามนั้นหากคุณต้องการวิธีการแก้ปัญหาในเชิงลึกยิ่งขึ้น แต่วิธีนี้จะทำงานได้อย่างสมบูรณ์แบบสำหรับกรณีการใช้งานนี้)


5

ใช้ bash ตัวเลือกที่ดีที่สุดของคุณคือ:

mkdir {0001..0666}

เพื่อสร้าง dirs ที่มีชื่อ0001ถึง0666(โดยไม่มีการเติมเต็มศูนย์)

หากคุณต้องการไดเรกทอรีที่มีชื่อprefix0001suffix, prefix0002suffix... แล้ว:

mkdir prefix{0001..0666}suffix

จะทำ.

ถ้าคุณต้องการชื่อไดเรกทอรีเลขคี่เท่านั้น

mkdir {0001..0666..2}

และอื่น ๆ ... ดูการขยายตัวรั้งในbashคู่มืออ้างอิง

เมื่อ FEichinger ชี้ให้เห็นคุณจำเป็นต้องทราบจำนวนไดเรกทอรีล่วงหน้า หากคุณต้องการโซลูชันที่ใกล้เคียงกับคุณ แต่ปลอดภัยและใช้ bash idiom ที่ทันสมัยกว่า:

for i in *.jpg; do ((++j)); mkdir $(printf "%04d" $j) ; done

สิ่งนี้มีประโยชน์สำหรับไดเรกทอรีที่ทราบก่อนหน้านี้เท่านั้นที่จะสร้าง โดยปกติเมื่อใช้ไดเรกทอรีที่มีหมายเลขคุณจะอยู่ในบริบทแบบไดนามิกซึ่งหมายความว่าควรกำหนดจำนวนเงินที่รันไทม์และยังคงต้องการการเติมสตริง ขึ้นอยู่กับกรณีการใช้งานเฉพาะ
user98085

@FEichinger ถูกต้อง! โพสต์แก้ไขตาม
gniourf_gniourf
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.