คำถามติดแท็ก wildcards

Globbing หมายถึงการจับคู่ไฟล์ตามรูปแบบชื่อที่มีอักขระตัวแทน

3
ลบประเภทไฟล์ทั้งหมดยกเว้นหนึ่งประเภทขึ้นไป
ฉันพยายามค้นหาคำสั่งเพื่อลบไฟล์ทั้งหมดในโฟลเดอร์ แต่ไม่ใช่ประเภทไฟล์ แต่ดูเหมือนว่าฉันจะไม่มีโชค สิ่งที่ฉันลองมาแล้ว: set extended_glob rm !(*.dmg) # this returns zsh:number expected rm ./^*.dmg # this returns no matches found รุ่นของ zsh zsh 5.0.2 (x86_64-apple-darwin13.0.1)ฉันใช้เป็น
20 zsh  wildcards 

1
echo [9876543210] แสดง 1 4 5 6 …ทำไม?
โปรดอธิบายว่าทำไม 1 4 5 6 แสดงเป็นคำสั่ง echo สี่ครั้งล่าสุด ฉันตีมันโดยบังเอิญครั้งเดียว แต่ตอนนี้ฉันอยากรู้ว่าทำไมพฤติกรรมนี้เกิดขึ้น ข้อความเหล่านี้ทำงานได้ตามที่คาดไว้ (สำหรับฉัน) $ echo [ 9876543210 ] [ 9876543210 ] $ echo [237890] [237890] ข้อความสะท้อนเหล่านี้แสดงอย่างต่อเนื่อง 1 4 5 6. มีอะไรพิเศษเกี่ยวกับตัวเลขเหล่านี้หรือไม่? $ echo [9876543210] 1 4 5 6 $ echo [abcd9876543210ghi] 1 4 5 6 $ echo [-123456-] 1 4 5 …

7
วิธีการหมุนภาพทั้งหมดในไดเรกทอรีด้วย imagemagick?
ฉันต้องการหมุนภาพทั้งหมดในไดเรกทอรีที่ตรงกับรูปแบบ จนถึงตอนนี้ฉันมี: for file in `ls /tmp/p/DSC*.JPG`; do convert $file -rotate 90 file+'_rotated'.JPG done แต่นั่นไม่ให้ผลลัพธ์?

2
zsh: ไม่รวมไฟล์จากรูปแบบ
ว่าฉันมีไฟล์ต่อไปนี้: |-- bar `-- foo |-- type_A_1 |-- type_A_2 |-- type_B_1 |-- type_B_2 |-- type_B_xx |-- type_B_xx `-- something_else ฉันคิดว่าคำสั่งดังต่อไปนี้ print -l foo/*~{type_B*} จะพิมพ์ทุกอย่างภายใต้foo ยกเว้นสิ่งที่เริ่มต้นด้วยtype_Bแต่ไม่พิมพ์แทนทุกอย่างภายใต้ foo: foo/type_A_1 foo/type_A_2 foo/type_B_1 foo/type_B_2 foo/type_B_xx foo/something_else ฉันพยายามprint -l foo/*~type_Bและได้สิ่งเดียวกัน wildcard ข้อยกเว้น~ทำงานใน zsh อย่างไร

3
ทุบตี globstar การจับคู่
ฉันมีโครงสร้างไดเรกทอรีนี้: ~/tmp/globstar ɀ find dir -type f dir/file.ext dir/subdir1/file.ext dir/subdir2/file.ext และด้วยglobstarตัวเลือกที่เปิดใช้งานใน Bash ฉันสามารถพูดได้: ~/tmp/globstar ɀ ls -1 dir/**/*.ext dir/subdir1/file.ext dir/subdir2/file.ext คำถามของฉันคือ: ทำไมถูกdir/file.extแยกออกจากรายการนี้? คู่มือทุบตีพูดถึงสิ่งนี้เกี่ยวกับglobstar: หากตั้งค่ารูปแบบ '**' ที่ใช้ในบริบทการขยายชื่อไฟล์จะจับคู่ไฟล์ทั้งหมดและไม่มีค่าไดเรกทอรีและไดเรกทอรีย่อยหรือมากกว่า หากรูปแบบนั้นตามด้วย '/' จะมีเพียงไดเรกทอรีและไดเรกทอรีย่อยเท่านั้นที่ตรงกัน “ ศูนย์ ” ในวรรคนี้ให้ฉันด้วยความประทับใจที่dir/file.extควรจะรวม; ถ้าฉันหวังว่าจะหายไปบางสิ่งบางอย่าง
18 bash  wildcards 

2
scp wildcard ไม่ทำงานใน zsh
ฉันเปลี่ยนไปใช้ zsh แล้วและก็ใช้งานได้ดี สิ่งหนึ่งที่แปลกประหลาดเมื่อฉันพยายาม scp ด้วย * wildcard มันใช้งานไม่ได้และฉันต้องไปทุบตี คำสั่งที่สองด้านล่างใช้งานได้ดี ความคิดเห็นใด ๆ เกี่ยวกับสาเหตุที่เป็นเช่นนี้และจะแก้ไขได้อย่างไร ~/dmp ⌚ 16:06:10 $ scp abc@123:/home/se/exports/201405091107/* . zsh: no matches found: root@uf3:/home/se/exports/201405091107/* ~/dmp ⌚ 16:06:53 $ bash sean@seanlaptop:~/dmp$ scp abc@123:/home/se/exports/201405091107/* .
17 zsh  wildcards 

2
`. []. foo []` ทำอะไรด้วยการทุบตี? ทำไมมันตรงกับ `.. '
ดูที่ต่อไปนี้: $ echo .[].aliases[] .. $ echo .[].foo[] .. $ echo .[].[] .. $ echo .[].xyz[] .. $ echo .xyz[].xyz[] .xyz[].xyz[] $ echo .xyz[].[] .xyz[].[] เห็นได้ชัดว่านี่ดูเหมือนจะมีบางสิ่งบางอย่าง แต่ฉันไม่เข้าใจว่าผลลัพธ์มารวมกันได้อย่างไร จากความเข้าใจของฉัน[]เป็นคลาสตัวละครที่ว่างเปล่า มันจะง่ายถ้า มันจับคู่เฉพาะสตริงว่าง ในกรณีนี้ฉันคาดหวังว่า bash จะทำซ้ำทั้งหมดเนื่องจากไม่มีสิ่งใดตรงกับในไดเรกทอรีนี้ แต่ยังจับคู่สิ่งต่าง ๆ เช่น..aliases(ในตัวอย่างแรก) หรือไม่มีอะไรเลย ในกรณีนี้ฉันคาดหวังว่า bash จะทำซ้ำสตริงทั้งหมด นี่คือกับ GNU bash, รุ่น 4.4.23 (1) - ปล่อย
16 bash  shell  wildcards 

2
ไม่สามารถขยายเครื่องหมายดอกจันโดยไม่ได้รับอนุญาต
บางคนสามารถอธิบายต่อไปนี้ให้ฉันได้หรือไม่ $ ls -ld /temp/sit/build/ dr-xr-s--- 3 asdf qwer 4096 Jan 31 2012 /temp/sit/build/ $ ls -ld /temp/sit/build/* ls: /temp/sit/build/*: Permission denied เห็นได้ชัดว่าฉันไม่สามารถใช้เครื่องหมายดอกจันที่นี่ ฉันลองด้วยคำสั่ง sudo และฉันได้รับข้อผิดพลาด "ไม่มีไฟล์ดังกล่าว" แทนที่จะ "ปฏิเสธสิทธิ์" ... sudo ls -l /temp/sit/build/* ls: /temp/sit/build/batch*: No such file or directory แต่ในที่สุดก็ใช้งานได้หากฉันไม่ได้ใช้ * sudo ls -l /temp/sit/build/ total 4 dr-xr-s--- …

4
หลีกเลี่ยงข้อผิดพลาดเนื่องจากเครื่องหมายดอกจันที่ไม่ขยาย
ในทุบตีฉันมักจะใช้ for-loops ดังต่อไปนี้ for file in *.type; do sommecommand "$file"; done; *.typeในการดำเนินการสำหรับทุกไฟล์ที่ตรงกัน หากไม่พบไฟล์ที่มีจุดจบนี้ในไดเรกทอรีใช้งานเครื่องหมายดอกจันจะไม่ถูกขยายและโดยปกติฉันจะได้รับข้อความแสดงข้อผิดพลาดที่บอกว่า somecommand ไม่พบไฟล์ ฉันสามารถคิดได้ทันทีหลายวิธีเพื่อหลีกเลี่ยงข้อผิดพลาดนี้ แต่การเพิ่มเงื่อนไขก็ไม่ได้ดูสวยงามมากนัก มีวิธีที่สั้นและสะอาดในการบรรลุเป้าหมายนี้หรือไม่?
16 bash  wildcards  for 

2
เครื่องหมายคำพูดคู่ในทุบตีจับคู่กันอย่างไร
GNU bash 4.3.48ฉันใช้ พิจารณาสองคำสั่งต่อไปนี้ที่แตกต่างกันโดยเครื่องหมายดอลลาร์เดียวเท่านั้น คำสั่ง 1: echo "(echo " * ")" คำสั่ง 2: echo "$(echo " * ")" ผลลัพธ์ของพวกเขาคือตามลำดับ (echo test.txt ppcg.sh ) และ * เห็นได้ชัดในกรณีแรก*คือก้อนกลมซึ่งหมายความว่าเครื่องหมายอัญประกาศแรกไปพร้อมกับที่สองในการสร้างคู่และที่สามและสี่ในรูปแบบคู่อื่น ในกรณีที่สอง*ไม่ได้ถูกทำให้กลมและมีช่องว่างพิเศษสองช่องในช่องสัญญาณออกหนึ่งช่องก่อนหน้าเครื่องหมายดอกจันและช่องว่างด้านหลังหมายความว่าเครื่องหมายคำพูดที่สองจะขึ้นกับช่องที่สามและช่องแรกจะไปกับช่องที่สี่ มีกรณีอื่นนอกเหนือจากการ$()ก่อสร้างที่มีเครื่องหมายอัญประกาศไม่ตรงกับอันถัดไป แต่ซ้อนกันแทน? พฤติกรรมนี้ได้รับการบันทึกไว้อย่างดีหรือไม่และถ้าใช่ฉันจะหาเอกสารที่เกี่ยวข้องได้จากที่ใด

6
วิธีรับไฟล์ N ล่าสุดในไดเรกทอรี?
ฉันมีไฟล์หลายไฟล์ที่เรียงลำดับโดยชื่อไฟล์ในไดเรกทอรี ฉันต้องการคัดลอกไฟล์ N สุดท้าย (พูด, N = 4) ไปยังโฮมไดเร็กตอรี่ของฉัน ฉันควรทำอย่างไร cp ./<the final 4 files> ~/

2
ฉันสามารถทำให้อินเทอร์แอคทีฟได้เฉพาะเมื่อใช้ globbing หรือไม่ (ใน bash หรือ zsh หรือทั้งสองอย่าง)
เมื่อใดก็ตามที่ฉันมีrmหลายรายการพร้อม ๆ กันกับที่มีเปลือกหอยกลมและมีความเป็นไปได้แม้แต่น้อยที่สุดที่รูปแบบขยายออกไปมากกว่าที่ฉันคาดไว้ฉันพยายามจำไว้เสมอว่าจะเพิ่ม-iแต่แน่นอนฉันสามารถลืมและระเบิดสิ่งที่มีประโยชน์ บางคนพยายามที่จะแก้ปัญหานี้ด้วยนามแฝงเช่นalias rm='rm -i'แต่ฉันเกลียดความคิดในการสร้าง rm แบบอินเทอร์แอคทีฟเสมอเพราะจากนั้นฉันจะใช้นิสัย-fตลอดเวลาซึ่งจะเอาชนะวัตถุประสงค์ทั้งหมดอย่างเห็นได้ชัด สิ่งที่ผมอยากจะทำคือให้rmใช้เฉพาะ-iเมื่อฉันใช้ globbing และ-fแน่นอนที่จะแทนที่ดังนั้นฉันยังคงสามารถระเบิดไดเรกทอรีออกไปทั้งที่มีตามปกติ-irm -rf junk ดังนั้นrm *blah*จริงๆจะเป็นrm -i *blah*แต่rm blahจะทำงานตรงตามที่พิมพ์ ในกรณีที่มีความแตกต่างในวิธีการที่จะประสบความสำเร็จในเปลือกหอยที่แตกต่างกันฉันจะเลือกคำตอบที่ให้วิธีการสำหรับทั้ง bash และ zsh มากกว่าคำตอบที่ครอบคลุมอย่างใดอย่างหนึ่งเท่านั้น หมายเหตุ : ฉันไม่เชื่อจริง ๆ ว่านี่เป็นความคิดที่ดี ฉันแค่ถามว่ามันเป็นไปได้ หากคุณคิดว่านี่เป็นความคิดที่โง่ฉันจะมีความสุขมากที่จะได้ยินเหตุผลที่อยู่เบื้องหลังความคิดเห็นของคุณ แต่โปรดอย่าแสดงความคิดเห็นไม่ได้โพสต์ดังกล่าวในฟิลด์คำตอบ คำตอบจริง ๆ บอกฉันว่าจะทำอย่างไรหรืออธิบายว่า / ทำไมจึงเป็นไปไม่ได้ (หรืออาจเสนอวิธีอื่นในการรับผลลัพธ์ที่คล้ายกัน) แต่ถ้าคุณต้องการที่จะบอกฉันว่าทำไมนี้เป็นใบ้กรุณาโพสต์เป็นความคิดเห็น ฉันจะลบล้างความคิดเห็นที่มีเหตุผลแม้ว่าฉันจะไม่เห็นด้วยกับข้อสรุปก็ตาม
15 bash  zsh  wildcards  rm 

2
GLOBIGNORE ทำงานอย่างไร
ตามหน้าคู่มือของ bash: GLOBIGNORE A colon-separated list of patterns defining the set of filenames to be ignored by pathname expansion. If a filename matched by a pathname expansion pattern also matches one of the patterns in GLOBIGNORE, it is removed from the list of matches. อย่างไรก็ตามในทางปฏิบัติ ... $ bash --noprofile --norc …

3
รายการที่มี `ls 'และนิพจน์ทั่วไป
ฉันจะแสดงรายการไฟล์ที่มีชื่อไฟล์ซึ่งลงท้ายด้วยอักขระตัวสุดท้ายและ.txtนามสกุลได้อย่างไร ฉันได้พยายามls *+([[:digit:]]).txtแต่นี้เป็นจริงสำหรับและabc12.txtabc2.txt abc2.txtแต่ผมจำเป็นต้องได้รับเท่านั้น ฉันจะทำสิ่งนั้นได้อย่างไร มีรูปแบบใด:digit:ที่จะทำเช่นนี้?
15 bash  wildcards 

2
ย้ายไฟล์ของรูปแบบเฉพาะไปยังไดเรกทอรีอื่น
ในไดเรกทอรี/home/inฉันมีไฟล์เช่นนี้: crust.MC12345.txt crust.etcMC12345.txt crust.MC23456.txt crust.etcMC23456.txt crust.etctcMC23456.txt ฉันต้องการย้ายcrust.etcMC12345.txtและcrust.etcMC23456.txtไปยัง dir อื่นเท่านั้น. /home/outรูปแบบที่ฉันใช้ในคำสั่ง mv สำหรับสถานการณ์ด้านบนคืออะไร?
15 shell  wildcards  mv 

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