2012-06-19 38 views
15

Tôi đã vô tình phát hiện ra điều này khi tìm kiếm tệp có số trong tên. Khi tôi gõ:Hành vi lệnh Windows DIR lạ

dir*số*

(nơi số đại diện cho bất kỳ số 0-9 và không có dấu cách giữa các dấu sao và số lượng)

tại cmd.exe dấu nhắc lệnh, nó trả về các tệp khác nhau không xuất hiện trong bất kỳ tệp nào để phù hợp với tiêu chí tìm kiếm. Điều kỳ lạ là tùy thuộc vào thư mục, một số con số sẽ hoạt động chứ không phải số khác. Một ví dụ là, trong một thư mục liên kết với một trang web, tôi gõ như sau:

dir *4* 

và những gì sẽ được trả về là:

 
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 

Đó chỉ là không thực hiện bất kỳ ý nghĩa với tôi. Bất kỳ đầu mối?

Câu hỏi được đặt ra trên stackOverflow vì lệnh DIR thường được kết hợp với chương trình FOR in batch. Hành vi DIR lạ dường như làm cho các chương trình hàng loạt có khả năng không đáng tin cậy nếu họ sử dụng lệnh DIR.

Chỉnh sửa: (ghi chú bổ sung). Mặc dù đã có nhiều thời gian trôi qua, tôi đã khám phá ra một điều kỳ quặc khác khiến tôi mất rất nhiều công sức. Tôi muốn xóa tất cả các tệp .htm trong một cây thư mục cụ thể. Tôi nhận ra ngay trước khi thực hiện điều đó là *.htm khớp với các tệp .html. Ngoài ra, *.man khớp với và có thể có những người khác. Xóa tất cả các tệp .html trong thư mục cụ thể đó sẽ khiến bạn khó chịu nhất.

+1

Thú vị! Chúng ta cần phải làm một số thử nghiệm về vấn đề này ... – Aacini

+0

Wow, sau tất cả những năm này - vẫn còn ngạc nhiên bởi công nghệ này. Tôi có thể xác nhận hành vi kỳ lạ đó. – Helbreder

+0

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

Trả lời

14

thẻ hoang dã tại dấu nhắc lệnh được khớp chống lại cả tên tập tin dài và ngắn "8,3" tên nếu một hiện diện . Điều này có thể gây bất ngờ.

Để xem tên viết tắt, hãy sử dụng tùy chọn /X cho lệnh DIR. Lưu ý rằng hành vi này không theo bất kỳ cách nào cụ thể với lệnh DIR và có thể dẫn đến những bất ngờ khác (thường khó chịu) khi thẻ hoang dã khớp với nhiều hơn mong đợi trên bất kỳ lệnh nào, chẳng hạn như DEL.

Không giống như trong vỏ * nix, việc thay thế mẫu tệp có danh sách tên phù hợp được thực hiện trong mỗi lệnh và không được thực hiện bởi chính vỏ đó. Điều này có nghĩa là các lệnh khác nhau có thể thực thi các quy tắc mẫu thẻ hoang dã khác nhau, nhưng trong thực tế điều này khá hiếm khi Windows cung cấp các cuộc gọi API để tìm kiếm thư mục cho các tệp khớp với mẫu và hầu hết các chương trình sử dụng các cuộc gọi đó một cách rõ ràng. Đối với các chương trình được viết bằng C hoặc C++ bằng cách sử dụng các công cụ "thông thường", việc mở rộng đó được cung cấp "miễn phí" bởi thư viện thời gian chạy C, sử dụng API Windows.

API Windows được đề cập là FindFirstFile() và họ hàng thân thiết FindFirstFileEx(), FindNextFile()FindClose().

Nhưng kỳ lạ, mặc dù các tài liệu cho FindFirstFile() mô tả tham số lpFileName của nó như là "thư mục hoặc đường dẫn và tên tập tin, trong đó có thể bao gồm ký tự đại diện, ví dụ, một dấu sao (*) hoặc một dấu chấm hỏi (?)" nó không bao giờ thực sự xác định ý nghĩa của các ký tự *?.

Ý nghĩa chính xác của mẫu tệp có lịch sử trong hệ điều hành CP/M có niên đại từ đầu những năm 1970 đã ảnh hưởng mạnh (một số có thể nói "đã được sao chép trực tiếp" thay cho "ảnh hưởng" tại đây) thiết kế MSDOS. Điều này đã dẫn đến một số hiện vật và hành vi "thú vị". Một số điều này ở cuối DOS của quang phổ được mô tả tại this blog post từ năm 2007, nơi Raymond mô tả chính xác cách thức tập tin patters được thực hiện trong DOS.

11

Đúng. Bạn sẽ thấy rằng nó cũng tìm kiếm thông qua tên ngắn nếu bạn cố gắng này:

dir /x *4* 

(/ x switch là cho tên ngắn)

cho tên tập tin lọc sử dụng:

dir /b | find "4" 
+1

nếu bạn muốn một Searh ONLY trong tên dài sử dụng | tìm thấy – npocmaka

+1

+1, Có, tên tệp ngắn "ẩn" có thể gây ra sự cố không rõ ràng. Đề xuất sử dụng FIND sẽ hoạt động: 'dir/b | tìm "4" '. Việc sử dụng FINDSTR thay vào đó sẽ cho phép lọc chọn lọc nhiều hơn thông qua các biểu thức chính quy. – dbenham

3

vẻ giống như lệnh dir tìm kiếm cũng ngắn (8,3 cách) tên tập tin dưới mui xe.

Khi tôi gọi dir *1* đây là những gì tôi nhận được:

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 

Có một tập tin gDEBugger-5_8.msi giữa những người được liệt kê, mà dường như không có bất kỳ nhân vật 1 trong đó.

Mọi thứ trở nên rõ ràng khi tôi sử dụng /X chuyển đổi bằng lệnh dir, làm cho thư mục sử dụng 8.3 tên tệp.Đầu ra từ một lệnh dir /X *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 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 

Trích từ sự giúp đỡ dir của:

/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

Một trích dẫn từ câu trả lời RBerteig của:

Lưu ý rằng hành vi này không có trong bất kỳ cách nào cụ thể cho các lệnh DIR, và có thể dẫn đến khác (thường khó chịu) ngạc nhiên khi một thẻ hoang dã trận đấu hơn dự kiến ​​trên bất kỳ lệnh nào, chẳng hạn như DEL.

Điều trên là đúng ngay cả đối với lệnh FOR, điều này rất khó chịu.

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

cũng sẽ tìm kiếm các tên viết tắt. Giải pháp một lần nữa sẽ là sử dụng hàm FIND hoặc FINDSTR để lọc ra các tên theo cách đáng tin cậy hơn.

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

Lưu ý - thay đổi% A thành %% A nếu sử dụng lệnh trong tập tin thực thi.

Kết hợp FOR với FINDSTR có thể là phương pháp chung để sử dụng an toàn bất kỳ lệnh nào gặp sự cố với tên tệp ngắn. Chỉ cần thay thế ECHO bằng lệnh lệnh như COPY hoặc DEL.