web-dev-qa-db-ja.com

拡張子が3文字を超えるファイルを含むWindowsワイルドカード

Windows 7には、次の4つのファイルを含むディレクトリがあります。

  • xxx.txt
  • xxx.txt2
  • xxx2.txt
  • xxx2.txt2

ファイルの拡張子が3文字を超える場合、ワイルドカード*の動作は奇妙に見えます。

dir *.txt

10/13/2014  04:14 PM                 6 xxx.txt
10/13/2014  04:17 PM                 6 xxx2.txt
10/13/2014  04:17 PM                 6 xxx2.txt2
10/13/2014  04:14 PM                 6 xxx.txt2
           4 File(s)             24 bytes
           0 Dir(s)   6,660,980,736 bytes free

Linuxマシンの場合のように、拡張子がtxtの2つのファイルのみが表示され、txt2のファイルは表示されないことが予想されます。 MS-DOSは、ファイル拡張子を3文字に切り捨てることを無視しますか、それとも最後に別のワイルドカードを自動的に追加しますか? txt拡張子のファイルだけを削除し、txt2のファイルは削除したくない場合、どのコマンドを使用する必要がありますか?ありがとう

6
tristof

MS-DOSを使用していません。それは3文字より長いファイル拡張子さえ許可しませんでした。 Windowsのコマンドライン(具体的には_cmd.exe_シェル)を使用しています。

しかし、Windowsは確かに、その時代のプログラムとの互換性を維持しようと懸命に努力しています。そのため、Windows 8(またはそのようなもの)までは、拡張子が長いすべてのファイルには、名前自体とともに、拡張子が切り捨てられたエイリアスがあります。

_dir /x_を実行すると、MS-の場合と同様に、各ファイルに「短い名前」が割り当てられ、8 +3文字に制限されていることがわかります。 DOSおよび16ビットWindows。

これらの名前は、たとえば、ユーザーがWindows 95にアップグレードし、元々Windows 3.1用に作成されたプログラムを介してファイルにアクセスしたい場合に使用します。したがって、16ビットプログラムを実行してもクラッシュせず、単に_C:\PROGRA~1_および_C:\MYDOCU~1\CALENDAR.TXT_および_C:\Program Files_の代わりに_C:\My Documents\Calendar.txt_。

(はい、一部の人々は実際にWindows XP/Vistaの時代でも古い16ビットソフトウェアを使用していました...しかし、Windows8はデフォルトで「短い名前」をオフにしていると確信しています。これが@EBGreenがない理由かもしれません'同じ'問題が表示されない '...)


考慮すべきもう1つのことは、古いWindowsシェル_cmd.exe_が、それ自体でかなりの数の癖と互換性の修正を増やしたことです。たとえば、MS-DOSがファイル名を照合する方法により、_dir .txt_は、意図的ではありませんが、_dir *.txt_と同じ意味でした。しかし、人々は短い構文に慣れており、Windowsオペレーティングシステム自体が_.txt_をワイルドカードとして扱わなくなったとしても、_cmd.exe_ まだその構文を受け入れます 。 (dirコマンドはそれ自体がプログラムではありませんが、シェルに組み込まれています。)

(同様に、リンクされた記事では、別のワイルドカードの癖が説明されています– Windowsファイル名にはno拡張子を付けることができますが、人々は実際には_*.*_と入力することに慣れています。 _*_と同じことを意味し、唯一のドットは無視されます。)

7
user1686

なぜそれがそのように機能するのか私には言えません。それはかなり奇妙です。私が言えることは、Powershell(マシン上にあるはずです)が期待どおりに機能するということです。 PowerShellの場合:

PS I:\temp\test> ls


    Directory: I:\temp\test


Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        10/13/2014   9:29 AM          3 bar.txt
-a---        10/13/2014   9:29 AM          3 bar.txt2
-a---        10/13/2014   9:29 AM          3 foo.txt
-a---        10/13/2014   9:29 AM          3 foo.txt2

PS I:\temp\test> ls *.txt


    Directory: I:\temp\test


Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        10/13/2014   9:29 AM          3 bar.txt
-a---        10/13/2014   9:29 AM          3 foo.txt
3
EBGreen

grawityは、動作が短いファイル名に起因することを正しく識別しました。ファイルマスクは、長い名前と短い名前の両方と比較されます。

ワイルドカードをファイル名と照合する方法の完全なルールは、 Windows RENAMEコマンドはどのように解釈するか)の "sourceMask"セクションにあります。ワイルドカード?

FINDSTRにパイプすることにより、目的のDIR結果を取得できます。

dir *.txt* | findstr /vrix "[0-9].*\.txt[^.][^.]*"
2
dbenham