2012-06-19 58 views
15

我在名稱中查找帶有數字的文件時意外地發現了這個問題。當I型:奇怪的Windows DIR命令行爲

dir**

(其中數字表示任何數目的從0到9,並用星號和數量之間沒有空格)在cmd.exe的

命令提示符下,它返回的各種文件不會出現在任何符合搜索條件的文件中。有什麼奇怪的是,取決於目錄,一些數字會起作用,而不是其他的。一個例子是,在與網站相關的目錄,我輸入以下命令:

dir *4* 

,返回的是:

 
Directory of C:\Ampps\www\includes\pages 

04/30/2012 03:55 PM    153 inventory_list_retrieve.php 
06/18/2012 11:17 AM    6,756 ix.html 
06/19/2012 01:47 PM   257,501 jquery.1.7.1.js 
       3 File(s)  264,410 bytes 
       0 Dir(s) 362,280,906,752 bytes free 

這只是沒有任何意義,我。任何線索?

問題出現在stackOverflow上,因爲DIR命令通常與批處理程序中的FOR組合在一起。奇怪的DIR行爲似乎使批處理程序可能不可靠,如果他們使用DIR命令。

編輯:(附加說明)。雖然過了很多時間,但我發現了另一個怪癖,幾乎讓我付出了很多工作。我想刪除特定目錄樹中的所有.htm文件。在做之前我意識到*.htm匹配.html文件。此外,*.man匹配,並可能有其他人。刪除該特定目錄中的所有.html文件將會令人不安。

+1

有趣!我們需要對此事做一些測試... – Aacini

+0

哇,這些年過去了 - 仍然爲這項技術所驚歎。我可以證實這種奇怪的行爲。 – Helbreder

+0

http://superuser.com/questions/336358/is-it-a-good-idea-to-disable-short-filenames-on-windows-7-running-on-a-ssd-drive –

回答

14

野生卡對陣雙方長文件名和短匹配「8.3」名稱(如果存在) 。這可能會產生驚喜。

要查看短名稱,請使用DIR命令的/X選項。

注意,這種行爲是不特定於DIR命令的任何方式,並可能導致其他的(通常不愉快)當一個通配符匹配超過預期的任何命令的驚喜,如DEL

與* nix shell不同,用匹配名稱列表替換文件模式是在每個命令中實現的,而不是由shell本身實現的。這可能意味着不同的命令可以實現不同的通配符模式規則,但實際上這很罕見,因爲Windows提供了API調用來搜索與目錄匹配的文件的目錄,而大多數程序以明顯的方式使用這些調用。對於使用「常用」工具以C或C++編寫的程序,該擴展是由C運行時庫使用Windows API「免費」提供的。

所述的Windows API是FindFirstFile()及其近親FindFirstFileEx()FindNextFile()FindClose()

奇怪的是,儘管對於FindFirstFile()的文檔描述了它的lpFileName的對象參數作爲「目錄或路徑,和文件名,它可以包括通配符,例如,一個星號(*)或問號(?)」它從未實際上定義了*?字符的含義。

文件模式的確切含義在1970年代早期的操作系統CP/M中有歷史記錄,這些操作系統對MSDOS的設計產生了強烈影響(有些人可能會說「被直接複製」而不是「影響到」)。這導致了一些「有趣的」工件和行爲。其中一些在DOS的末端描述於2007年的this blog post,其中Raymond準確地描述了DOS中如何實現文件模式。

11

是的。你會看到,它也通過搜索短名稱,如果你試試這個:

dir /x *4* 

(/ x開關是短名稱)

用於過濾文件名使用:

dir /b | find "4" 
+1

如果您只想在長名稱中使用搜索|找到 – npocmaka

+1

+1,是的,「隱藏的」短文件名可能會導致不明顯的問題。使用FIND的建議應該工作:'dir/b |找到「4」。 FINDSTR的使用將允許通過正則表達式進行更多的選擇性過濾。 – dbenham

3

似乎像dir命令一樣可以在引擎蓋下搜索簡短(8.3格式)的文件名。

當我打電話dir *1*這是我得到:

Volume in drive C is System 
Volume Serial Number is F061-0B78 

Directory of C:\Users\Piotrek\Desktop\Downloads 
2012-05-20 17:33  23 639 040 gDEBugger-5_8.msi 
2012-05-20 17:30   761 942 glew-1.7.0.zip 
2012-05-20 17:11   9 330 176 irfanview_plugins_433_setup.exe 
2012-05-24 20:17   4 419 192 SumatraPDF-2.1.1-install.exe 
2012-05-15 22:55   3 466 248 TrueCrypt Setup 7.1a.exe 
       5 File(s) 1 127 302 494 bytes 

有一個gDEBugger-5_8.msi文件當中列出的,這顯然不具有任何1字符在裏面。

當我用dir命令使用/X開關時,一切就變得清晰了,這使得dir使用8.3文件名。從dir /X *1*命令的輸出:dir命令的幫助

Volume in drive C is System 
Volume Serial Number is F061-0B78 

Directory of C:\Users\Piotrek\Desktop\Downloads 


2012-05-20 17:33  23 639 040 GDEBUG~1.MSI gDEBugger-5_8.msi 
2012-05-20 17:30   761 942 GLEW-1~1.ZIP glew-1.7.0.zip 
2012-05-20 17:11   9 330 176 IRFANV~1.EXE irfanview_plugins_433_setup.exe 
2012-05-24 20:17   4 419 192 SUMATR~1.EXE SumatraPDF-2.1.1-install.exe 
2012-05-15 22:55   3 466 248 TRUECR~1.EXE TrueCrypt Setup 7.1a.exe 
       5 File(s) 1 127 302 494 bytes 

引用:在命令提示符下

/X   This displays the short names generated for non-8dot3 file 
      names. The format is that of /N with the short name inserted 
      before the long name. If no short name is present, blanks are 
      displayed in its place. 
4

從RBerteig的回答報價:

請注意,這種行爲是不以任何方式具體到DIR命令, 並可能導致其他的(通常不愉快)驚訝時,外卡 匹配多個可以在任何命令上使用,比如DEL。

即使對於非常討厭的FOR命令,上述情況也是如此。

for %A in (*4*) do @echo %A contains a 4 

也將搜索短名稱。解決方案將再次使用FIND或FINDSTR以更可靠的方式過濾名稱。

for %A in (*) do @echo %A | >nul findstr 4 && echo %A contains a 4 

注 - 更改%A至%%如果使用批處理文件中的命令的一個。

將FOR和FINDSTR結合起來可以成爲一種通用的方法,以安全地使用任何遇到短文件名的問題的命令。只需用問題命令(如COPY或DEL)替換ECHO即可。