CMD: *. * Veya sadece *?


47

1990'larda *.*MS-DOS'da herhangi bir dosya adını göstermek için " " kullanırdım, ancak *bugünlerde sadece " " kullanarak daha fazla komut dosyası gördüm . Hangisini kullandığım bir fark yaratıyor mu?


9
İç komutlar ve modern komut satırı yardımcı programları için eşittir *ve *.*şimdi eşittir olsa da, cmddosya maskesi parametrelerini alan bazı eski yardımcı programlar daha eski dosya eşleme işlevlerini kullanabilir ve bunlar için maskeler eşdeğer olmaz.
AFH,

@AFH Belirteçlerin eşit olduğunu sanmıyorum. *.*Belirteç extensionless dosyaları iade edilmemelidir.
tuskiomi

1
@tuskiomi - Uzantısız dosyaları döndürmemesi *.* gereken konusunda seninle aynı fikirdeyim . Maalesef öyle. Grawity'nin cevabına bakınız.
AFH,

Yanıtlar:


65

Dosya adı ve uzantısı, Windows 95 ve NT 3.5'in "uzun dosya adı" desteği sağladığından beri tek bir alan oldu ve joker eşleşmeleri tüm dosya adına aynı anda yapıldı. Sonuç olarak, içinde nokta olmayan bir dosya adınız olabilir (dosyalar için nadir olabilir, ancak klasörler / dizinler için çok yaygındır) ve ilk bakışta *.*aslında bu dosyalarla eşleşmez.

Eski komut dosyaları kullanarak *.* olacak çünkü uyumluluk kod hala işi - ile joker uçları ise .*, o kısım olan OS tarafından görmezden geldi. (Öyleyse, özellikle bir uzantıya sahip dosyaları eşleştirmek istiyorsanız, bunun için ihtiyacınız olacağını sanırım *.?*.)

Ama güvenmeniz gereken bir şey değil; Modern Windows sürümleri için komut dosyaları yazıyorsanız, MS-DOS kurallarını değil , kurallarını izleyin . (Windows NT itibariyle .bat komut olduğunu Not değil artık ama MS-DOS tarafından yorumlanır cmd.exe, doğal bir Win32 programı.)


Linux ve diğer çeşitli Unixen, Açık adı ve uzantısı ilk etapta ayrı olmamıştı ve orada değil yapmak için herhangi bir özel sihirli *.*yüzden, işin *mantıklı tek seçenektir.


14
"Uzantılı dosyaları filtrelemeyi zorlaştıralım! Yay!" Anonim Microsoft Geliştirici
John Hamilton

50
"Herkese milyonlarca mevcut toplu komut dosyasını kıralım! Yay!" -Hayır, Microsoft Developer, Ever
Grawity

3
ISTR DOS bazı eski sürümlerinde, bu *sadece dosya adları eşleşir olmadan bir uzantısı. Her ikisiyle de uyumlu olmanın 'güvenli' yolu kullanmaktı **.
Random832

8
OP, Windows ile ilgili, ancak Linux'tan bahsettiğinizden beri: Bazı mermilerde (örneğin Bash), *( varsayılan olarak ) gizli dosya adlarıyla eşleşmiyor (a ile başlayan .).
Florian Brucker

4
Bazı "OS seviyesi" değerleri için ... Windows'ta da gerçekten bir kabuk (Explorer) konsepti var - çekirdek çalıştırılabilir dosyalar üzerinde .exe ile veya başka hiçbir şeyle ilgilenmiyor. Windows Gezgini'nin Linux'taki Nautilus'tan daha "işletim sistemi seviyesi" olup olmadığı tartışılabilir.
Grawity

11

Muhtemelen unixy / vb Bourne kabuğu, bash, ksh, zsh gibi posixy kabukları (glob karakter gibi bir joker genişlemesini yapmak bahsetmemiz var *, ?, [range], [!range]ve diğer açılımlar parantez ve genişletilmiş Neználkovo gibi) bağımsız değişkenlerin bir listesini derlemek için önce komuta Idam edildi. Dolayısıyla bu genişleme, bu argümanların olabileceği komut tarafından değil kabuk tarafından yapılır.

yani, ne için genişler *, kabuk sorumludur*.*

 $ 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

Bu, CMD'de (ve powershell yardımcı programları için de benzer şekilde ), yürütülen karakterleri yürütülen komutun içinde geçen glob karakterlerini geçtiği için geçerli değildir - ve böylece genişleme, komutun / yardımcı programın sorumluluğundadır, kabuk değil. Nihayetinde, konvansiyonlara uyması (veya uymaması) için yardımcı programa ne *.*ya da *araç bırakıldı - bu nedenle CMD'nin yardımcı programları dir *.*da uzantıları olmayan eşleştirmeler (tartışmasız olarak yine de saklı tutuyorlardı) gibi programları içeriyor .

Bu şekilde özetlemenin güvenli olduğuna inanıyorum.

  • CMD altında yardımcı programa bağlıdır.
  • PowerShell'de, WildCardPattern Class'tan yararlanan yardımcı programlar, tutarlı bir posixy davranış alt kümesi sağlayacaktır.

Başka bir fark, CMD'de, çoğu programın aslında ham joker karakterini çekirdeğe (FindFirstFile) iletirken, Linux'taki dünya tam listenin tamamını kapar ve kullanıcı alanında filtreleme yapar.
Grawity

Milyon dosya içeren bir dizinde * çalıştırdığınızda, komut çok fazla parametreden şikayet edecektir. En kötü durumda, listenin kuyruğunu sessizce bırakabilir. Bu gibi durumlarda, iki veya daha fazla komutu yönlendirmeniz veya bir dosyada dosya isimlerinin listesini kaydetmeniz gerekir, böylece diğer işlemler listeyi okuyabilir.
Enric Naval,

3
@grawity Daha kesin olmak gerekirse, filtreleme Windows'taki dosya sistemi sürücüsü tarafından yapılır. Bu özellikle ağ dosya sistemlerinde yararlıdır (özellikle uzak bir dosya sistemine 8 kb'lik bir hat çalıştırdığınızda geri), ancak aynı zamanda açıkça desteklenen aramaların yanı sıra rasgele arama yapamayacağınız anlamına da gelir. Bunun sonuçları Raymond Chen'in blogunda defalarca araştırıldı. FindFirstFilekendisi kullanıcı kipidir (hem kernel32.dll hem de ntdll.dll kullanıcı kipleridir - kernel'in Win32 alt sisteminin bir parçası), ancak gerçekte pek bir şey yapmaz.
Luaan

Ah, FindFirstFile'nin benzer bir syscall'ı doğrudan sardığı (libc'deki açık (3) Linux çekirdeğinde nasıl açık (2)) olduğu izlenimindeydim.
Grawity

1
@cup: Kabuğun globları genişlemesini önlemek için tırnak işaretleri kullanın; böylece bunları komutlara iletebilirsiniz. örn mmv "fred.*" "tom.#1". (Yerine kullanım #1yerine *izin verme avantajına sahip olan yerine, yerine kullanır ). mmvçoğu sistemde varsayılan olarak yüklenmez, ancak diğer toplu iş yeniden adlandırma araçları genellikle kullanılır. Bununla ilgili bu makaleye bakın ve stackoverflow.com/questions/417916/how-to-do-a-mass-rename .
Peter Cordes,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.