ฉันจะบอกให้ mkdir ลองสร้าง dir1 ได้อย่างไรและถ้ามันมีอยู่แล้วให้สร้าง dir2 เป็นต้นจนกว่าจะพบชื่อที่ไม่มีอยู่จริง


13

ฉันต้องการสร้างไดเรกทอรีที่มีหมายเลขที่ท้าย ex "dir1" และเพิ่มจำนวนนั้นถ้าไดเรกทอรีนั้นมีอยู่แล้วจนกว่าจะพบชื่อไดเรกทอรีที่ไม่มีอยู่และฉันต้องทำในบรรทัดเดียวใน บรรทัดคำสั่ง Linux คล้ายกับ:

mkdir --increment dir$

ฉันจะทำยังไงต่อไป?

จนถึงตอนนี้ฉันได้รับสิ่งนี้:

dir=output; n=0; mkdir -p $dir$n; if test -d $dir$n; then n=$((n+1)); echo $dir$n; fi

แต่มันก็แค่สะท้อนชื่อ dir ถัดไปฉันต้องการให้มันรันคำสั่งซ้ำ

คำตอบ:


26

นี่คือการออกกำลังกายเล็กน้อยในการใช้while:

n = 0
ในขณะที่! mkdir dir $ n
ทำ
    n = $ ((n + 1))
เสร็จแล้ว

แต่แน่นอนว่ามันไม่ได้คิดมากนักที่จะรู้ว่ากลไกเล็ก ๆ น้อย ๆ นี้ไม่ได้ดีขนาดนั้น

ดังนั้นแทนที่จะสร้างล้อใหม่และต้องกำจัดมุมทั้งหมดอีกครั้งหนึ่งสร้างไดเรกทอรีชั่วคราวที่ไม่ซ้ำกันจากแม่แบบแตกต่างกันเล็กน้อย:

name = $ (mktemp -d dirXXXXXXXXXXXX)


ค้นหาเลขฐานสองอาจดีพอ
Thorbjørn Ravn Andersen

มีหลายมุมที่จะโกนออกจากที่ที่คุณกำลังเริ่มต้นในกระบวนการสร้างใหม่ของล้อไม่น้อยที่จำระบบไฟล์พิจารณาความปลอดภัยและขนาน
JdeBP

6

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

DATE=$(date +%F)
mkdir "dir-$DATE"

มันจะสร้างไดเรกทอรีที่มีชื่อเช่นdir-2014-03-02( YYYY-MM-DDเพื่อให้ปรากฏตามลำดับตัวอักษร)

หากคุณสร้างมากกว่าหนึ่งไดเรกทอรีต่อวันคุณสามารถเพิ่มเวลาปัจจุบันให้กับชื่อไฟล์ ดูเกี่ยวกับวิธีการปรับแต่งการแสดงผลการจัดรูปแบบของman datedate


5

ค้นหา dirname "ที่ใหญ่ที่สุด" ก่อนรับจำนวนและเพิ่มที่:

last_dir=(printf "%s\n" dir* | sort -Vr | head -1)
num=$(last_dir#dir)
mkdir "dir$((num+1))"

นี่เป็นความคิดที่ดี แต่ไม่ใช่เรื่องง่ายที่จะเปรียบเทียบ
Thorbjørn Ravn Andersen

การขนานจะเป็นการปรับให้เหมาะสมก่อนเวลาอย่างแน่นอนเว้นแต่จะมีไดเรกทอรีเป็นล้าน ๆ ไดเรกทอรี
เกล็นแจ็คแมน

ทำไมคุณต้องการprintfที่นี่ จะไม่echoทำงานง่าย ๆ
Ruslan

นอกจากนี้ผมต้องการใช้แทนdir[0-9]* dir*
Ruslan

1
คุณเข้าใจผิด ฉันพูดถึงว่าสคริปต์มีเหตุผลที่จะเรียกใช้หลายครั้งพร้อมกัน (หลายเธรดผู้ใช้หลายคน ฯลฯ ) หรือไม่
Thorbjørn Ravn Andersen

2

สมมติว่าไดเรกทอรีของคุณเริ่มต้นที่ "dir1" เสมอและไม่มีไฟล์ชื่อ $ dir * (iE เป็นไดเรกทอรีที่มีหมายเลขตามลำดับทั้งหมด) คุณสามารถไปกับซับนี้ได้

mkdir ${dir}$(( `ls ${dir}* | wc -w` + 1 ))

สิ่งนี้จะนับจำนวนไฟล์ที่เริ่มต้นด้วย $ dir จากนั้นเพิ่มหนึ่งไฟล์ในจำนวนนั้นและสร้างไฟล์ใหม่


0

ภาคผนวกของคำตอบอื่น ๆ : หากคุณต้องการให้ผู้จัดเรียงเรียงลำดับตามชื่ออย่างถูกต้องคุณอาจต้องการวางหมายเลข dir ใหม่ (NUM) ด้วยเลขศูนย์นำหน้าด้วยความยาวคงที่

ต่อไปนี้อาจรวมตัวเป็นหนึ่งบรรทัดหรือฝังในโซลูชันอื่น

NUM="00"$NUM                  ## Left zero pad with fixed length - 1 zeros 
NUM=${NUM:((${#NUM} - 3)):3}  ## left trim to fixed length (3 in this case)

สมมติว่า NUM เริ่มต้นอย่างน้อย 1 หลักและจะไม่เกินความยาวคงที่ ปรับตามความต้องการของคุณ

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