*
เป็น glob ที่ถูกขยายโดยเชลล์ โดยค่าเริ่มต้นหอยไม่รวมไฟล์ที่มีชื่อขึ้นต้นด้วย.
(เรียกว่าไฟล์ที่ซ่อนอยู่หรือ dotfiles) เว้นแต่ว่าชั้นนำ.
จะถูกป้อนอย่างแท้จริง
*
หรือ[.]*
หรือ?*
หรือ*.*
หรือdir/*
จะไม่รวม dotfiles
.*
หรือdir/.*
จะ
ดังนั้นคุณสามารถทำได้:
mv -- * .* /dest/
อย่างไรก็ตามเชลล์บางตัวรวมถึงbash
(แต่ไม่ใช่zsh
, mksh
และfish
) มีความผิดพลาดที่การขยายของ.*
รวม.
และ..
รายการไดเร็กทอรีพิเศษ, ซึ่งคุณไม่ต้องการที่นี่ (และโดยทั่วไปไม่ต้องการให้ glob รวมซึ่งเป็นเหตุผลที่ฉันเรียกมันว่า
ด้วยเหตุผลดังกล่าวคุณจะพบว่าบางครั้งผู้คนใช้ (ในเชลล์คล้ายบอร์น):
mv -- * .[!.]* ..?* /dest/
นั่นคือสาม globs หนึ่งตรงกับไฟล์ที่ไม่ซ่อนแรกคนที่สองชื่อไฟล์ที่เริ่มต้นด้วย.
ที่ตามตัวอักษรอื่นที่ไม่ใช่.
และ 3 หนึ่งชื่อไฟล์ที่เริ่มต้นด้วย..
ที่ตามตัวอักษรอย่างน้อยหนึ่ง
อย่างไรก็ตามกระสุนสมัยใหม่บางตัวมีวิธีที่ดีกว่า
zsh
ด้วยzsh
คุณสามารถใช้ตัว(D)
ระบุแบบกลมเพื่อระบุว่ารูปแบบวงกลมควรมีดอทไฟล์
mv -- *(D) /dest/
zsh
ยังแก้ไขว่าการบอร์เชลล์เชลล์ผิดพลาดอื่น ๆ ในกรณีที่รูปแบบไม่ตรงกันmv
คำสั่งจะไม่ทำงาน
ดังที่ได้กล่าวไว้ข้างต้นมันจะไม่รวม.
หรือ..
อยู่ในความโกลาหลดังนั้น
mv -- * .* /dest/
จะปลอดภัย อย่างไรก็ตามหากไม่มีไฟล์ที่ตรงกัน*
หรือไม่มีไฟล์ที่ตรง.*
กับคำสั่งจะถูกยกเลิกดังนั้นควรใช้:
mv -- (*|.*) /dest/
เช่นเดียวกับในเปลือกหอยอื่น ๆ คุณสามารถบังคับ globs ทั้งหมดให้รวม dotfiles (ตัวอย่างเช่นถ้าคุณพบว่าตัวเองต้องการ dotfiles รวมบ่อยกว่า) ด้วย:
setopt dotglob
หรือ:
set -o dotglob
หลังจากนั้นหากคุณต้องการให้ glob เฉพาะไม่รวม dotfiles คุณสามารถเขียนมันได้:
echo *(^D)
หรือ:
echo [^.]*
ทุบตี
น่าเสียดายที่bash
ไม่มีตัวระบุ glob ดังนั้นคุณเหลือที่เปิดใช้งานการรวม dotfile ทั่วโลก ในbash
ไวยากรณ์คือ:
shopt -s dotglob
(และใช้[^.]*
สำหรับ globs โดยไม่มีไฟล์ที่ซ่อนอยู่)
ด้วยdotglob
, bash
ไม่รวม.
มิได้..
ใน globs เหมือน*
แต่ยังคงไม่สำหรับ globs .*
เช่น
หากคุณตั้งค่าGLOBIGNORE
ตัวแปรเป็นสิ่งที่ไม่ว่างเปล่ามันจะเปิดใช้งานdotglob
ตัวเลือกโดยอัตโนมัติและแยก.
และ..
ออกจาก.*
globs แต่ไม่ใช่จากdir/.*
หรือ.*/file
วัตถุ (!) เพื่อให้การป้องกันไม่มีประโยชน์ คุณสามารถทำGLOBIGNORE='*/.:*/..:./*:../*:*/./*:*/../*'
แต่แล้วมันจะทำลาย globs เหมือน*/.
หรือหรือ./*
../*
ทำงานได้ดีขึ้นรอบ ๆ คือการใช้[.]*
หรือdir/[.]*
หรือ[.]*/file
(ที่มีdotglob
การเปิดใช้งาน) เพื่อขยาย dotfiles ยกเว้นและ.
..
ปลา
fish
globs ไม่รวมมิได้.
..
เมื่อไม่มีการแข่งขันขึ้นอยู่กับรุ่นก็จะทำงานเหมือนอย่างใดอย่างหนึ่งzsh
(หรือbash -o failglob
) bash -o nullglob
หรือ
mv -- * .* /dest/
จะทำงานหากมีทั้งไฟล์ที่ซ่อนและไม่ซ่อน มิฉะนั้น YMMV และในบางเวอร์ชันอาจเรียกได้mv -- /dest
ว่าไม่มีไฟล์เลย
ksh93
ไม่มีตัวระบุแบบกลมในตัวksh93
ใดตัวหนึ่ง คุณสามารถรวม dotfiles ใน globs ด้วย:
FIGNORE='@(.|..)'
ขัดกับbash
's GLOBIGNORE
, ที่ทำอย่างถูกต้องและยังแก้ไขปัญหาของการ.*
รวมและ.
..
Yash
yash
มีdot-glob
ตัวเลือก ( set -o dot-glob
) แต่ตรงกันข้ามกับbash
การขยาย glob (แม้กระทั่ง*
) รวมถึง.
และ..
ดังนั้นจึงไม่มีประโยชน์สวย
tcsh
set globdot
ธิเช่นเดียวกับในbash
ที่มี*
รวมถึงไฟล์ dot ยกเว้น.
และ..
แต่.*
ยังรวมถึง.
และ..
(และคุณสามารถใช้[.]*
เพื่อขยายไฟล์ที่ซ่อนยกเว้น.
และ..
)