เมื่อใดที่คุณใช้การขยายรั้ง


49

ฉันเข้าใจว่าการขยายรั้งคืออะไร แต่ฉันไม่รู้ว่าจะใช้งานได้อย่างไร

คุณจะใช้เมื่อไหร่?
กรุณาสอนตัวอย่างที่สะดวกและน่าทึ่งให้ฉันถ้าคุณมีเคล็ดลับของคุณเอง

คำตอบ:


52

การขยายตัวของ Brace นั้นมีประโยชน์มากหากคุณมีชื่อพา ธ ยาว ฉันใช้มันเป็นวิธีที่รวดเร็วในการสำรองไฟล์ :

cp /a/really/long/path/to/some/file.txt{,.bak}

จะคัดลอก/a/really/long/path/to/some/file.txtไปที่/a/really/long/path/to/some/file.txt.bak

นอกจากนี้คุณยังสามารถใช้งานได้ในลำดับ ผมเคยดาวน์โหลดหลายหน้าจากเว็บ:

wget http://domain.com/book/page{1..5}.html

หรือ

for i in {1..100}
do
   #do something 100 times
done

8
สามารถใช้สำหรับการทำซ้ำการโต้แย้งได้เช่นกัน สมมติว่าคุณมีโปรแกรมที่ต้องการอาร์กิวเมนต์ '-f' เพื่อให้ทุกไฟล์ทำงานได้ แทนที่จะทำprogram -f file1 -f file2 -f file3คุณสามารถทำได้program "-f file"{1..3}
แพทริค

นี่เป็นความอัปยศ ฉันเพิ่งค้นพบมัน แต่ทำสิ่งสำรองบนเส้นทางที่ยาวเป็นพิเศษเป็นเวลาหลายปีโดยไม่ทราบว่า rhis ขอบคุณ
smonff

2
@ แพทริก: นั่นล้มเหลวเนื่องจากprogramได้รับสามคำ: "-f file1" "-f file2" "-f file3"แทนจาก "-f" "file1" "-f" "file2" "-f" "file3"6:
musiphil

@dogbane: การใช้ส่วนขยายสำหรับการใช้งานในforลูปนั้นไม่มีจุดหมายเพราะคุณสามารถเขียนได้for ((i=1; i<=100; i++))และมีประสิทธิภาพมากกว่า
musiphil

30

การขยายของ Brace มาสะดวกมากเมื่อสร้างโครงสร้างไดเรกทอรีขนาดใหญ่:

mkdir -p dir1/{subdir1,subdir2}/{subsubdir1,subsubdir2}

สิ่งนี้จะทำให้คุณ

find dir1 -type d
dir1
dir1/subdir1
dir1/subdir1/subsubdir1
dir1/subdir1/subsubdir2
dir1/subdir2
dir1/subdir2/subsubdir1
dir1/subdir2/subsubdir2

คุณสามารถก้าวต่อไปอีกขั้นและใส่การขยายรั้งลงในการขยายรั้ง:

mkdir -p dir1/{subdir{1,2}}/{subsubdir{1,2}}

สิ่งนี้จะให้โครงสร้างไดเรกทอรีเหมือนกับตัวอย่างด้านบน


3
การทำรังนั้นดี แต่ตัวอย่างการทำรังของคุณ ( mkdir -p dir1/{subdir{1,2}}/{subsubdir{1,2}}) ไม่ได้มีจุดประสงค์ใด ๆ mkdir -p dir1/subdir{1,2}/subsubdir{1,2}คุณจะได้ทำเพียงแค่นี้:
iconoclast

@iconoclast มันมีจุดประสงค์ถ้าคุณตีความsubdir1และ subdir2ในความหมายที่ไม่ใช่ตัวอักษร แทนที่subdir1ด้วยcatและsubdir2ด้วยdogตัวอย่างเช่น
ephsmith

2
@ephsmith: หากคุณตีความ "subdir1" ว่ายืนเป็น "cat" และ "subdir2" สำหรับ "dog" ดังนั้นตัวอย่างการซ้อนล้มเหลวเนื่องจากใช้ subdir {1,2} และไม่มีสตริงที่คุณสามารถแทนที่ได้ "subdir" โดยที่จะทำให้ subdir {1,2} คืน {cat, dog}
iconoclast

21

ฉันใช้เมื่อต้องการลดการพิมพ์:

geany /path/to/file1 /path/to/file2
# versus
geany /path/to/file{1,2}

ตัวอย่างอื่น:

wajig install libpam0g-dev libiw-dev libdb-dev
# versus
wajig install lib{pam0g,iw,db}-dev

12

ฉันใช้มันเพื่อเปรียบเทียบผลการทดสอบจริงกับผลการทดสอบที่ต้องการระหว่างการพัฒนา หากการทดสอบ # 41 ล้มเหลวคุณสามารถเห็นความแตกต่างระหว่างเอาต์พุตการทดสอบ (ในไฟล์ tests.output / 041) และเอาต์พุตที่ต้องการ (ในไฟล์ tests.out / 041):

$ diff tests.{out,output}/041

10

บางกรณีที่พบบ่อยสำหรับฉันคือ:

สำหรับการเปลี่ยนชื่อ:

mv myText.{txt,tex}

หรือ

mv myText.tex{,.old}

หรือ

cp myText.tex{,.backup}

(แม้ว่าจะยุ่งน้อยกว่าในการใช้การควบคุมเวอร์ชันสำหรับ 2 งานสุดท้าย)

สำหรับการเปรียบเทียบ (กล่าวถึงแล้ว):

diff path{1,2}/a.txt

3

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

ฉันไม่ได้ใช้มันในเชลล์สคริปต์ของฉัน (เว้นแต่จะมีเหตุผลอื่น ๆ ที่สคริปต์ควรจะทุบตีหรือ zsh แม้ว่าในกรณีเหล่านั้นดีที่สุดในการอัพเกรดเป็นภาษาสคริปต์ "จริง" เช่นperlหรือpython) การขยายของตัวรั้งไม่สามารถเคลื่อนย้ายได้เนื่องจากไม่ได้อยู่ในมาตรฐานเชลล์ POSIX แม้ว่ามันจะทำงานใน/bin/sh- เชลล์สคริปต์ของคุณshebang ed แต่มันจะไม่ทำงานบนระบบที่มี/bin/shเชลล์ที่ถูกสแนปชอตมากกว่า(เช่นdash)

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

Bashism:

diff file{1,2}

พกพา:

diff file[12]

3
ความแตกต่างคือfile{1,2}จะขยายเป็นเสมอfile1 file2ในขณะที่file[12]ขยายไปยังชื่อไฟล์ที่มีอยู่เท่านั้น: เช่นถ้าfile1มี แต่file2ไม่file[12]ขยายเป็นfile1เท่านั้น การ[]ขยายตัวเป็นเวอร์ชัน?ขยายตัวที่ถูก จำกัด จริงๆ(และเรียกว่า "การขยายชื่อพา ธ ")
musiphil

ถูกต้องการขยายรั้งไม่ได้เปลือก globbing (aka การขยายชื่อพา ธ ) นั่นเป็นการโทรออกที่ดีที่ยังไม่ได้กล่าวถึงจริง ๆ : การขยายรั้งนั้นดีกว่าในการสังเกตเส้นทางที่หายไปโดยไม่คาดคิด นอกจากนี้คุณยังสามารถกลมกล่อมภายในการขยายรั้ง
Adam Katz
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.