CMD: *. * หรือ just *?


47

ย้อนกลับไปในปี 1990 ฉันจะใช้ " *.*" เพื่อแสดงชื่อไฟล์ใด ๆ ใน MS-DOS แต่ฉันได้เห็นสคริปต์เพิ่มเติมโดยใช้เพียงแค่*วันนี้ "" จริง ๆ แล้วมันสร้างความแตกต่างที่ฉันใช้?


9
ในขณะที่เป็นจริงที่*และ*.*ขณะนี้เทียบเท่าcmdคำสั่งภายในและยูทิลิตีบรรทัดคำสั่งที่ทันสมัยยูทิลิตี้เก่าที่ใช้พารามิเตอร์มาส์กไฟล์อาจใช้ฟังก์ชั่นการจับคู่ไฟล์ที่เก่ากว่าและสำหรับมาสก์นั้นจะไม่เทียบเท่า
AFH

@AFH ฉันไม่คิดว่าโทเค็นเท่ากัน *.*โทเค็นไม่ควรกลับไฟล์ extensionless
tuskiomi

1
@tuskiomi - ฉันเห็นด้วยกับคุณว่า*.* ไม่ควรส่งคืนไฟล์ส่วนขยาย น่าเสียดายที่มันไม่ ดูคำตอบของ Grawity
AFH

คำตอบ:


65

ชื่อไฟล์และนามสกุลเป็นฟิลด์เดียวนับตั้งแต่ Windows 95 และ NT 3.5 แนะนำการสนับสนุน "ชื่อไฟล์ยาว" และการจับคู่สัญลักษณ์แทนจะทำกับชื่อไฟล์ทั้งหมดในครั้งเดียว เป็นผลให้คุณสามารถมีชื่อไฟล์โดยไม่มีจุดอยู่ในนั้น (อาจหายากสำหรับไฟล์ แต่เป็นเรื่องธรรมดามากสำหรับโฟลเดอร์ / ไดเรกทอรี) และเมื่อเหลือบมองครั้งแรก*.*จะไม่ตรงกับไฟล์ดังกล่าว

สคริปต์เก่าที่ใช้*.* จะยังคงทำงานได้เนื่องจากรหัสความเข้ากันได้ - หากสัญลักษณ์แทนลงท้ายด้วย.*ส่วนนั้นจะถูกละเว้นโดยระบบปฏิบัติการ (ดังนั้นหากคุณต้องการจับคู่ไฟล์โดยเฉพาะกับส่วนขยายฉันเดาว่าคุณจะต้อง*.?*ใช้สิ่งนั้น)

แต่ไม่ใช่สิ่งที่คุณควรพึ่งพา หากคุณกำลังเขียนสคริปต์สำหรับรุ่น Windows ที่ทันสมัยให้ทำตามอนุสัญญาของพวกเขาไม่ใช่ระเบียบของMS-DOS (โปรดทราบว่าในฐานะของ Windows NT สคริปต์. bat จะไม่ถูกตีความโดย MS-DOS อีกต่อไป แต่โดยcmd.exeโปรแกรม Win32 ดั้งเดิม)


บน Linux และ Unixen อื่น ๆ ชื่อและนามสกุลไม่เคยแยกจากกันตั้งแต่แรกและไม่มีเวทมนตร์พิเศษใด ๆ ที่จะ*.*ทำงานดังนั้น*เป็นทางเลือกเดียวที่สมเหตุสมผล


14
"มาทำให้มันยากขึ้นในการกรองไฟล์ที่มีนามสกุล! Yay!"
John Hamilton

50
"มาแบ่งสคริปต์ชุดที่มีอยู่หลายล้านรายการให้กับทุกคน! - ไม่มีนักพัฒนาของ Microsoft เคย
grawity

3
ISTR ที่ใน DOS รุ่นเก่าบางรุ่น*จะจับคู่ชื่อไฟล์โดยไม่มีส่วนขยายเท่านั้น วิธี 'ปลอดภัย' **เข้ากันได้กับทั้งสองคือการใช้
Random832

8
OP เกี่ยวกับ Windows แต่เนื่องจากคุณพูดถึง Linux: ในเชลล์บางตัว (เช่น Bash), *ทำ ( โดยค่าเริ่มต้น ) ไม่ตรงกับชื่อไฟล์ที่ซ่อนอยู่ (เริ่มต้นด้วย a .)
Florian Brucker

4
สำหรับค่าบางอย่างของ "ระดับระบบปฏิบัติการ" ... มันเป็นแนวคิดของเชลล์ (Explorer) ใน Windows เช่นกัน - เคอร์เนลไม่สนใจเกี่ยวกับ. exe บนไฟล์เรียกทำงานหรืออะไรก็ตาม Windows Explorer เป็น "ระดับระบบปฏิบัติการ" มากกว่า Nautilus ใน Linux หรือไม่
grawity

11

มันอาจเป็นมูลค่าการกล่าวขวัญว่า unixy / การเปลือกหอย posixy เช่นเปลือกบอร์นทุบตี ksh, zsh ฯลฯ ทำการขยายตัวของตัวแทน (ของตัวละคร glob ชอบ*, ?, [range], [!range]และการขยายอื่น ๆ เช่นการจัดฟันและ globs ขยาย) เพื่อรวบรวมรายชื่อของการขัดแย้งก่อนที่คำสั่ง ถูกประหารชีวิต ดังนั้นการขยายตัวนี้ทำโดยเชลล์ไม่ใช่คำสั่งที่อาจขัดแย้งกัน

เช่นเปลือกเป็นผู้รับผิดชอบสำหรับสิ่งที่*, *.*ขยาย

 $ ls
 file.csv  file.doc  file.pdf  file.txt  file.xlsx  zz-file-without-extension

 $ (set -xv; foo *)   # is actually expanded to the following
   + foo file.csv file.doc file.pdf file.txt file.xlsx zz-file-without-extension

 $ (set -xv; foo *.*)  # note this does not match `zz-file-without-extension`
   + foo file.csv file.doc file.pdf file.txt file.xlsx

นี่ไม่ใช่กรณีใน CMD (และในทำนองเดียวกันสำหรับโปรแกรมอรรถประโยชน์ powershell ) ในขณะที่มันส่งผ่านอักขระ glob คำต่อคำในการดำเนินการ - และดังนั้นการขยายตัวเป็นความรับผิดชอบของคำสั่ง / ยูทิลิตี้และไม่ใช่เปลือก ดังนั้นในที่สุดสิ่งที่*.*หรือ*วิธีการที่ถูกทิ้งไว้ในยูทิลิตี้ปล่อยให้มันเป็นไปตาม (หรือไม่) เพื่อการประชุม - ซึ่งเป็นสาเหตุที่ยูทิลิตี้ของ CMD เช่นdir *.*จับคู่ยัง (เนื้อหาไม่ถูกต้อง

ฉันเชื่อว่ามันปลอดภัยที่จะสรุปวิธีนี้

  • ภายใต้ CMD มันขึ้นอยู่กับยูทิลิตี้
  • ภายใต้ PowerShell ยูทิลิตี้ที่ใช้ประโยชน์จากWildCardPattern Classจะให้ชุดย่อยที่สอดคล้องกันของพฤติกรรม posixy

ความแตกต่างอีกอย่างหนึ่งก็คือภายใต้ CMD โปรแกรมส่วนใหญ่จะส่งต่อ wildcard แบบดิบไปยังเคอร์เนล (FindFirstFile) ในขณะที่ glob บน Linux จะคว้ารายการทั้งหมดและทำการกรองในพื้นที่ผู้ใช้
grawity

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

3
@grawity เพื่อให้แม่นยำยิ่งขึ้นการกรองจะกระทำโดยไดรเวอร์ระบบไฟล์ใน Windows สิ่งนี้มีประโยชน์โดยเฉพาะอย่างยิ่งในระบบไฟล์เครือข่าย (โดยเฉพาะอย่างยิ่งเมื่อคุณสามารถเรียกใช้สาย 8 kb ไปยังระบบไฟล์ระยะไกลได้) แต่ก็หมายความว่าคุณไม่สามารถทำการค้นหาแบบสุ่มได้ ความหมายของสิ่งนี้ได้รับการสำรวจหลายครั้งในบล็อกของ Raymond Chen FindFirstFileตัวเองเป็นโหมดผู้ใช้ (ทั้ง kernel32.dll และ ntdll.dll เป็นไลบรารีโหมดผู้ใช้ - เป็นส่วนหนึ่งของระบบย่อย Win32 ไม่ใช่เคอร์เนล) แต่มันก็ไม่ได้ทำอะไรมาก
Luaan

อาฉันอยู่ภายใต้ความประทับใจที่ FindFirstFile ห่อหุ้ม syscall ที่มีชื่อคล้ายกันโดยตรง (เช่นวิธีเปิด (3) ใน libc เพียงแค่เปิด (2) ในเคอร์เนล Linux)
grawity

1
@cup: เพียงใช้เครื่องหมายคำพูดเพื่อป้องกันเชลล์ไม่ให้ขยาย globs ดังนั้นคุณสามารถส่งไปยังคำสั่ง mmv "fred.*" "tom.#1"เช่น (การแทนที่ใช้#1แทน*ซึ่งมีข้อได้เปรียบในการให้คุณสั่งซื้อฟิลด์ใหม่) mmvไม่ได้ติดตั้งโดยค่าเริ่มต้นในระบบส่วนใหญ่ แต่เครื่องมือเปลี่ยนชื่อชุดอื่น ๆ มักจะเป็น ดูบทความนี้เกี่ยวกับเรื่องนี้และstackoverflow.com/questions/417916/how-to-do-a-mass-rename
Peter Cordes
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.