ใน Bash มีการรับรองการขยายสัญลักษณ์แทนในลำดับหรือไม่


53

การขยายตัวของสัญลักษณ์แทนใน Bash รับประกันว่าจะเป็นไปตามลำดับตัวอักษรหรือไม่? ฉันถูกบังคับให้แยกไฟล์ขนาดใหญ่ออกเป็น 10 Mb ชิ้นเพื่อให้พวกเขาสามารถได้รับการยอมรับจากที่เก็บ Mercurial ของฉัน

ดังนั้นฉันคิดว่าฉันสามารถใช้:

split -b 10485760 Big.file BigFilePiece.

แล้วแทนที่:

cat BigFile | bigFileProcessor

ฉันทำได้:

cat BigFilePiece.* | bigFileProcessor

ในสถานที่

อย่างไรก็ตามฉันไม่สามารถหาที่ใดก็ได้ที่รับประกันได้ว่าการขยายตัวของเครื่องหมายดอกจัน (หรือที่รู้จักว่าไวด์การ์ด, aka *) จะเป็นไปตามลำดับตัวอักษรเสมอ.aaมาก่อนหน้า.abนี้

นอกจากนี้ยังมีข้อบกพร่องในแผนของฉันบ้างไหม? ประสิทธิภาพในcatการรวมไฟล์เป็นอย่างไร?


4
แน่นอนคุณกำลังทำผิดวิธี หากผู้ดูแลระบบกำหนดขนาดไฟล์ที่คุณมีในที่เก็บคุณควรพูดคุยกับเขา พูดถึงการขยายตัว - ฉันเห็นเสมอว่าการขยายตัวเป็นตัวอักษรและตัวเลข
Mircea Vutcovici

1
คุณสามารถผ่านไปได้ตลอดเวลาsortหากคุณต้องการการจัดการคำสั่งซื้อเพิ่มเติม
วอร์เนอร์

2
โปรดทราบว่า Mercurial สามารถจัดการไฟล์ได้ทุกขนาด จำกัด ตามจำนวน RAM ที่คุณมี คุณจะได้รับคำเตือนหากคุณเพิ่มไฟล์ขนาดใหญ่เนื่องจาก Mercurial จะถือว่าไฟล์นั้นสามารถเก็บไฟล์ไว้ในหน่วยความจำได้ สำหรับการผสาน Mercurial จำเป็นต้องเก็บสองไฟล์ไว้ในหน่วยความจำ เครื่องที่มี RAM ขนาดเล็กอาจมีปัญหาในการตรวจสอบไฟล์ ฉันเพิ่งทดสอบและhg commitในNไฟล์ MB ต้องการ3 * NRAM hg updateประมาณ2 * NMB และต้องการRAM ประมาณMB นี่คือ Mercurial 1.5 บน Linux
Martin Geisler

คำตอบ:


67

ใช่การขยายแบบวงกลมนั้นเป็นตัวอักษร

จากmanหน้าBash :

การขยายชื่อพา ธ

หลังจากแยกคำเว้นแต่-fตัวเลือกที่ได้รับการตั้งค่าทุบตีสแกนแต่ละคำสำหรับตัวละคร*, และ? [หากหนึ่งในอักขระเหล่านี้ปรากฏขึ้นคำนั้นจะถือเป็นรูปแบบและแทนที่ด้วยรายการที่เรียงลำดับตามตัวอักษรของชื่อไฟล์ที่ตรงกับรูปแบบ


@Dennis Williamson ความคิดใด ๆ ที่จะยังคงเป็นจริงหากผู้ใช้มีชุดภาษาอื่น
Zoredache

5
@Zoredache: จริง ๆ แล้วถูกระบุโดย POSIX: opengroup.org/onlinepubs/007908775/xsh/glob.html "ชื่อพา ธ นั้นเรียงตามลำดับที่กำหนดโดยการตั้งค่าปัจจุบันของหมวด LC_COLLATE [ LCDCOLLATE] [ opengroup.org / onlinepubs / 007908775 / XBD / ... "และมันเป็นเหตุผลที่คุณควรจะทำสิ่งที่ชอบแทนls -l [[:lower:]] ls -l [a-z]
Dennis Williamson

โปรดทราบว่าคำสั่งนี้เป็นแบบตัวอักษรดังนั้น BigFilePiece.10 จะมาก่อน BigFilePiece.2
Ken

@DennisWilliamson - ทำไมต้องเลือกวงเล็บเหลี่ยมสองคู่ หนึ่งดูเหมือนว่าจะทำงานเหมือนกันกับฉัน
ArtOfWarfare

2
@ArtOfWarfare: mkdir lctest; cd lctest; touch w; touch z; ls -l [:lower:]; echo =====; ls -l [[:lower:]]ลองนี้: ไฟล์ "z" จะถูกระบุไว้ในชื่อที่สองเท่านั้นlsเพราะมันจะขอชื่อไฟล์ตัวอักษรพิมพ์เล็ก ตัวแรกls- ชื่อที่ไม่มีเครื่องหมายวงเล็บเหลี่ยมด้านนอก - กำลังขอชื่อไฟล์อักขระเดี่ยวจากรายการอักขระ ":", "l", "o", "w", "e" และ "r" ในทั้งสองกรณีวงเล็บเหลี่ยมด้านนอกสุดจะกำหนดขอบเขตนิพจน์วงเล็บปีกกาซึ่งแสดงรายการอักขระและคลาส ในกรณีของ[[:lower:]]เครื่องหมายวงเล็บเหลี่ยมด้านในโคลอนและชื่อคำว่าคลาสอักขระ ...
Dennis Williamson

4

มันเป็นพฤติกรรมที่บันทึกไว้bashเพื่อให้คุณสามารถพึ่งพาได้ในสคริปต์ของคุณ มันเป็นเรื่องจริงของเชลล์ที่ใช้งานร่วมกับ Bourne คนอื่น ๆ มาเป็นเวลานาน ... แม้ว่าอาจจะมีมุมเล็ก ๆ เกี่ยวกับตัวพิมพ์เล็กและตัวพิมพ์ใหญ่หรือตัวอักษรและตัวเลข

(รายการผลลัพธ์ในbashจะอยู่ในคำสั่ง "ASCII-betical" เกือบ --- ยกเว้นว่าตัวอักษรตัวพิมพ์เล็กและใหญ่จะถูกเรียงรวมเข้าด้วยกันราวกับว่าไม่มีความแตกต่างของตัวอักษร แต่มีตัวพิมพ์เล็กและตัวพิมพ์เล็กก่อน - ผู้ป่วยโรคเบาหวานควรเรียงลำดับเดียวกันตามที่ปรากฏใน ASCII)

ตามที่คนอื่น ๆ ได้ชี้ให้เห็นว่าสิ่งนี้อาจรบกวนการตั้งค่าสภาพแวดล้อมที่เกี่ยวข้องกับภาษาของคุณ: LANG โดยทั่วไปและ LC_COLLATE เจาะจงมากขึ้น ในอาจจะปลอดภัยที่สุดในการรันคำสั่งที่ขึ้นอยู่กับการสั่งซื้อแบบขยาย glob ภายใต้envคำสั่งเพื่อล้างสภาพแวดล้อม (ใช้-iหรือ-uตามความเหมาะสม) หรือไปป์ผลลัพธ์ผ่านsortเพื่อให้แน่ใจว่าการเรียงลำดับที่แข็งแกร่ง


4
ปรากฏว่าไม่ใช่ตัวเลขและตัวอักษรทั้งหมดจะถูกละเว้นในกระบวนการเรียงลำดับ ดังนั้น "=", "_", "~" จึงไม่สามารถใช้บังคับให้ไฟล์เริ่มต้นหรือสิ้นสุด (ตามลำดับ) รายการ
Otheus

3

ในขณะที่การขยายตัวของ glob จะถูกจัดเรียงตามตัวอักษรพวกเขายังเชื่อฟังการตั้งค่าการเปลี่ยนค่าของเชลล์

ตรวจสอบให้แน่ใจว่าตั้งค่านี้เป็น "C" ในสคริปต์ของคุณหากคุณต้องการให้พกพาได้

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