`dir *。*`がすべてのファイルとフォルダーを提供するのはなぜですか?


62

実行するdir *.*と、予期しない結果が生じます。名前にドットのないファイルやフォルダーもリストされます。例えば

C:\>dir *.*
 Volume in drive C is System
 Volume Serial Number is AC0A-29DA

 Directory of C:\

14-03-2017  05:17 PM             8,192 ntuser.dat
03-01-2017  07:10 PM    <DIR>          Perl520
28-03-2017  10:13 AM    <DIR>          Program Files
28-03-2017  10:13 AM    <DIR>          Program Files (x86)
04-01-2017  03:25 PM    <JUNCTION>     Python27 [C:\Program Files\Anaconda]
06-02-2017  10:16 PM    <DIR>          SAP
28-03-2017  04:10 PM               152 useragent.log
03-01-2017  03:04 PM    <DIR>          Users
16-03-2017  04:24 PM    <DIR>          VM
22-03-2017  11:13 AM    <DIR>          Windows
               2 File(s)          8,344 bytes
               8 Dir(s)  270,172,966,912 bytes free

何故ですか?ドット付きのファイルのみをリストする方法はありますか?


19
ドットは常にそこにあり、それに続くものがない限り、印刷されません。言い換えれば、ファイルの名前は「これは私のファイル」と思われるかもしれませんが、ひそかに名前は「これは私のファイル」です。ドットの後には何もありません。同様に、このサイトのDNS名は「superuser.com」と考えるかもしれませんが、実際には「superuser.com」です。2番目のドットの後には何もありません。
トッドウィルコックス

12
@ToddWilcox DOSでのみ正しい。Windowsで現代のファイルシステムはもう別の拡張子の名前空間を持っていない
phuclv

13
@LưuVĩnhPhúcWin32サブシステムは、これを含む多くの目的のために、最終的に.aを含むようなものを含まないファイル名を扱います.
-CodesInChaos

2
.文字を含まないフォルダー.は、末尾に暗黙の文字があります。-たとえば、「Blah.old」という名前のフォルダを作成すると、従来の3文字のファイル拡張子になります。日常の使用では、「Blah」はBlah.ファイルであろうとフォルダであろうと「」と同じです。
BrainSlugs83

9
@ can-ned_food Todd WilcoxはDNSについて正しいです。ルートDNSゾーンは、文字通りと呼ばれ.、DNS名のラベルは.(ルートDNSゾーンの名前は単一のゼロ長ラベルです)で区切られます。ルートDNSゾーンの1つの子.com.であり、の1つの子はなどcom.ですsuperuser.com.
CVn

回答:


115

OPは次のことを強調しているため、この回答を書いています。

私が興味を持っているのは、質問で述べられているように、すべてのファイルに一致する理由*.*です

DIRコマンドは、時から来ています:

  1. ピリオド(。)は、ファイルまたはフォルダー名の文字として許可されていません
  2. ファイル名とフォルダー名は、名前が8文字、拡張子が3文字に制限されていました

したがって、その標準で*.*、名前と拡張子何でも意味していました。それが意味するものではありませんでした 文字列を「 『または前または後に文字を持っていてもいなくてもよいです』。」

マイクロソフトのポリシーは、後方互換性を保持しています。したがって、その解釈*.*は保持されます。

ただし、Windows PowerShellでは、「。」を含む文字列を*.*意味し、「。」の前後に文字が含まれる場合と含まれない場合があります。


10
追加資料
p

25
元のファイルシステムでは、ピリオド自体もディスクに保存されず、残りの名前を構成するのは11文字だけでした。
ミスターリスター

7
拡張子のないファイルとフォルダは、まだ空白の拡張子を持っているものとして扱われることに注意してください。したがって、ウィンドウに関する限り、Folder.Folder」という名前のフォルダーと「」という名前のフォルダーには同じ名前が付けられます。
BrainSlugs83

2
@MrLister興味深い。古いFS AA.BBは、最初の部分に8未満、拡張子に3未満のようなファイル名をどのように保存しましたか?スペースでパディングしただけですか?
ケルビン

3
@Kelvinはい、2つの部分は別々にスペースで埋められました。
プラグウォッシュ

12

何故ですか?

ワイルドカードの記事で「なぜですか?」に対する答えを見つけることができます。

The * wildcard will match any sequence of characters
               (0 or more, including NULL characters)

The ? wildcard will match a single character
               (or a NULL at the end of a filename)

ワイルドカード一致ルール

  • *通常、0個以上の任意の文字に一致しますが、1つの例外があります(次の規則を参照)。欲張りでないワイルドカードは、マスクの残りの部分が一致するのに必要な数の文字を自由に一致させることができます。

  • *.マスクの最後は、{dot}を除く0個以上の文字と一致します。実際には、*と終端{dot}の間の任意の数の{dot}および{space}文字でルールが適用されます。この用語の正規表現は"[*][. ]*[.]$"

  • ?{dot}を除き、0または1文字に一致します。0文字に一致するのは、名前の末尾または{dot}の前の位置に一致するときだけです。疑問符を複数回使用して、複数の文字に一致させることもできます。

含意。ファイル/フォルダー名の最後の {ドット}は、ベース名と拡張子を区切ります。そう

  • dir *.拡張子なしのすべてのアイテムを表示
  • dir *.*ゼロ以上の文字の拡張子を持つすべてのアイテムを表示します。

厳密に言えば、nameにピリオド)のないすべてのアイテムをdir *.表示します。(BTW、命名ファイル、パス、および名前空間の MSDN記事では、「名前の最初の文字としてピリオドを指定することは容認できます」と明示さています。).

ドット付きのファイルのみをリストする方法はありますか?

そうは思いません。ただし、適切な正規表現による回避策があります。

PowerShell(Powershellコンソールで使用する場合のフルスコープソリューション):

:: PowerShell - no extension, full syntax
PowerShell -c "Get-ChildItem | Where-Object {$_.Name -match '^.[^\.]*$'}"
:: PowerShell -    extension, alias syntax
PowerShell -c "dir | ? {$_.Name -match '^..*\...*$'}"

Cmd(アイデアのみであり、詳細な説明が必要な場合があります):

:: CMD/batch - no extension
for /F "delims=" %%G in ('dir /OGN /B ^| findstr "^.[^\.]*$"') do @echo %%~tG %%~aG %%~zG %%~nxG
:: CMD/batch -    extension
for /F "delims=" %%G in ('dir /OGN /B ^| findstr "^..*\...*$"') do @echo %%~tG %%~aG %%~zG %%~nxG

補遺:ボーナスと説明

Name連結されBaseNameExtension 保持されない直感的な推測。次のスクリプトは、コア機能を使用cmdしてそれを証明しPowerShell奇妙な ^..*\...*$正規表現はその結果から派生しています。

@ECHO OFF
SETLOCAL EnableExtensions DisableDelayedExpansion
set "_workingDirectory=%~1"
if "%_workingDirectory%"=="%tmp%\tests_SU_1193102" (
  >NUL 2>&1 (
      mkdir "%_workingDirectory%"
      pushd "%_workingDirectory%"
      rem make directories
      mkdir     .Fldr-Ext
      mkdir     aFldr-Ext
      mkdir     .Fldr.Ext
      mkdir     aFldr.Ext
      rem create files
      copy  NUL .File-Ext 
      copy  NUL aFile-Ext 
      copy  NUL .File.Ext 
      copy  NUL aFile.Ext
      popd
  )
) else if "%_workingDirectory%"=="" set "_workingDirectory=%CD%"
pushd "%_workingDirectory%"
set "_first=ItemName  Attributes    BaseName Extension"
echo ON
::                        dir /OGN | findstr "Ext$"
for /F "delims=" %%G in ('dir /OGN /B') do @((if defined _first (echo %_first%&echo(&set "_first="))&echo %%~nxG %%~aG  %%~nG   %%~xG)
::   Get-ChildItem | Select-Object -Property Mode, BaseName, Extension, Name
PowerShell -c "dir | select -pr Name, Mode, BaseName, Extension | sort -pr @{Expression='Mode';Descending=$true}, @{Expression='Name';Descending=$false}"

出力

==> D:\bat\BaseName_vs_Extension.bat "%tmp%\tests_SU_1193102"

==> for /F "delims=" %G in ('dir /OGN /B') do @((if defined _first (echo ItemName  Attributes   BaseName Extension  & echo(  & set "_first=" ) )  & echo %~nxG %~aG     %~nG    %~xG )
ItemName  Attributes    BaseName Extension

.Fldr.Ext d----------   .Fldr   .Ext
.Fldr-Ext d----------           .Fldr-Ext
aFldr.Ext d----------   aFldr   .Ext
aFldr-Ext d----------   aFldr-Ext
.File.Ext --a--------   .File   .Ext
.File-Ext --a--------           .File-Ext
aFile.Ext --a--------   aFile   .Ext
aFile-Ext --a--------   aFile-Ext

==> PowerShell -c "dir | select -pr Name, Mode, BaseName, Extension | sort -pr @{Expression='Mode';Descending=$true}, @{Expression='Name';Descending=$false}"

Name      Mode   BaseName  Extension
----      ----   --------  ---------
.Fldr.Ext d----- .Fldr.Ext .Ext
.Fldr-Ext d----- .Fldr-Ext .Fldr-Ext
aFldr.Ext d----- aFldr.Ext .Ext
aFldr-Ext d----- aFldr-Ext
.File.Ext -a---- .File     .Ext
.File-Ext -a----           .File-Ext
aFile.Ext -a---- aFile     .Ext
aFile-Ext -a---- aFile-Ext

BaseNameファイルおよびフォルダーごとに異なるプロパティの定義を比較します。

PS D:\PShell> Get-ChildItem | Get-Member -Name BaseName | Format-List -property TypeName, Definition


TypeName   : System.IO.DirectoryInfo
Definition : System.Object BaseName {get=$this.Name;}

TypeName   : System.IO.FileInfo
Definition : System.Object BaseName {get=if ($this.Extension.Length -gt 
             0){$this.Name.Remove($this.Name.Length - 
             $this.Extension.Length)}else{$this.Name};}

私の最初の答えは、許されない誤解に基づいていました。

読み取りdir /?、使用dir /A:-D

/A          Displays files with specified attributes.
attributes   D  Directories                R  Read-only files
             H  Hidden files               A  Files ready for archiving
             S  System files               I  Not content indexed files
             L  Reparse Points             -  Prefix meaning not

別のアプローチ:findstr正規表現dir *.* | findstr /V "<.*>"


私が興味があるのは、質問で述べられているように、すべてのファイル一致する理由*.*です
-phuclv

私はあなたの代わりの提案(findstrのは)で始まるフォルダが見つかりません怖い.ように.dbus-keyrings.VirtualBox.vscode

22
それでdir /A:-D、幸せなファイルだけをリストしますか?
クエンティン

4
「ドット付きのファイルのみをリストする方法はありますか?」dir /A:-D間違っています。1 /拡張子のないファイルをリストします。2 / .名前にが含まれるディレクトリはリストされない(完全に合法)
DavidPostill

3
omg ...最後に「@echo off」を見たのは数十年前
09

7

ドット付きのファイルのみをリストする方法はありますか?

文書化されていないワイルドカードを使用して、ファイル名とドットを一致させることができます<

dir "<.<"

それは覚えている<あなたが引用またはコマンドシェルからのパターンでそれを使用したときに、それをエスケープする必要があるので、また、メタ文字です。


1
優れた。この文書化されていないワイルドカードは確かに存在します
-phuclv

1

コマンドラインインタープリターは、「」を「すべての拡張子」を持つ「すべてのベースファイル名」として表示します。空白の拡張子はまだextensionなので、リストと一致して返されます。他の人が説明したように、これは以前のバージョンのWindowsおよびMS-DOSからの二日酔いです。

PowerShellを使用して見て満足している場合、これらのファイルを見つけるのははるかに簡単です。PowerShellでは、「dir」は「Get-ChildItem」コマンドレットのエイリアスであることに注意してください。

拡張子(たとえば、「FileWithNoExt」ではなく「myfile.txt」)を持つすべてのファイル(ディレクトリ/フォルダではない)を検索するには:

dir -af | Where {$_.Name -match "\."}

「-af」スイッチは、戻りオブジェクトをファイルのみに制限する「-File」の省略形です。「-ad」はディレクトリのみを取得します。「\。」「リテラルドット文字」を意味します。バックスラッシュなしでは、標準の正規表現に従って、ドットは任意の文字に一致します。

名前にドットと拡張子が付いていないすべてのファイルを取得するには、拡張子(たとえば、「myfile.txt」ではなく「myDocument_v1.1.doc」)を使用します。

dir -af | Where {$_.BaseName -match "\."}

ただし、これにより、ドットが前に付いた「.archive」などの名前のファイルが除外されることに注意してください。これは、ベース名がなく、「アーカイブ」の拡張子を持つものとして扱われるためです。これらを含める場合:

dir -af | Where {$_.BaseName -match "\.|^$"}

ここで、一致パターンは、「リテラルドット、OR(|)BeginningOfString(^)の後にEndOfString($)(つまり、空の文字列)」と表示されます。ファイルには空のベース名拡張子の両方を含めることはできないため、ドットで始まるファイルを検索します。


ls *.*他の多くの人があなたの前に答えているように、PowerShell で十分です
-phuclv

-2

上記のコマンドを入力する場合:*(これは任意の文字シーケンスを意味するワイルドカードです)にドット(。)が続き、*が続くことは、(任意の文字シーケンス)。(文字の任意のシーケンス)。これは、任意の拡張子を持つすべてのファイルを表示することをさらに意味します。


1
次に、なぜProgram Filesリストに含まれていますか?パターンと一致しません<sequence of characters>.<sequence of characters>
グロノスタジ

<ゼロまたはそれ以上の文字のシーケンス>と考えると、ベース名が空白の ".info"というファイルも取得する理由です。
-Dave_J
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.