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
何故ですか?ドット付きのファイルだけを一覧表示する方法はありますか?
OPは次のことを強調しているため、この回答を書いています。
私が興味があるのは、なぜ
*.*
がすべてのファイルに一致するか、質問で述べられているように
DIR
コマンドは、次の場合に由来します。
したがって、その標準では、*.*
は、名前と拡張子を意味します。それ意味しない「。」を含む文字列。「。」の前後に文字がある場合とない場合があります。
マイクロソフトのポリシーは、後方互換性を保持しています。したがって、*.*
の解釈は保持されます。
しかし、Windows PowerShellでは、*.*
はを含む文字列を意味し、「。」の前後に文字がある場合とない場合があります。
Wildcards の記事で「なぜですか?」に対する答えを見つけることができます。
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}の前の位置に一致するときだけです。疑問符を複数回使用して、複数の文字に一致させることもできます。
含意。ファイル/フォルダー名のlast {dot}separatesベース名と拡張子。そう
dir *.
はすべてのアイテムに拡張子なしを表示し、dir *.*
は、すべてのアイテムの拡張子がゼロ以上の文字を表示します。厳密に言えば、dir *.
は名前にno period(.
)のすべてのアイテムを表示します。 (ところで、 Naming Files、Paths、およびNamespaces 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
はBaseName
とExtension
が連結されているという直感的な推測は成り立たない。次のスクリプトは、cmd
およびPowerShell
コア機能を使用してそれを証明し、weird^..*\...*$
正規表現はその結果から導出されます。
@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
CompareBaseName
プロパティの定義、ファイルとフォルダーで異なります:
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
regex をdir *.* | findstr /V "<.*>"
として適用する
ドット付きのファイルだけを一覧表示する方法はありますか?
文書化されていないワイルドカード<
を使用すると、ファイル名とドットを一致させることができます。これは、ベース名の0個以上の文字のシーケンスまたは拡張子の0個以上の文字のシーケンスのいずれかに一致します。
dir "<.<"
<
もメタキャラクターであることを忘れないでください、それであなたはコマンドShellからのパターンでそれを使うときはいつでもそれを引用するか、またはエスケープする必要があります。
コマンドラインインタプリタは、 "。"を "すべての拡張子"付きの "すべてのベースファイル名"として認識します。空白の拡張子はそれでも拡張子なので、リストと一致して返されます。他の人が説明したように、これは以前のバージョンのWindowsとMS-DOSからの二日酔いです。
PowerShellを使って見て満足しているなら、これらのファイルを見つけるのはずっと簡単です。 PowerShellでは、 "dir"は "Get-ChildItem"コマンドレットのエイリアスです。
拡張子を持つすべてのファイル(ディレクトリ/フォルダではない)を検索するには( "myfile.txt"ではなく "FileWithNoExt"ではない):
dir -af | Where {$_.Name -match "\."}
"-af"スイッチは "-File"の省略形で、戻りオブジェクトをファイルだけに制限します。 "-ad"はディレクトリのみを取得します。 「\」 「リテラルドット文字」を意味します。円記号がないと、標準の正規表現に従って、ドットは任意の文字に一致します。
拡張子だけでなく拡張子も含めずに名前にドットがあったすべてのファイルを取得するには( "myDocument_v1.1.doc"ではなく "myfile.txt"など)。
dir -af | Where {$_.BaseName -match "\."}
ただし、これにより、 "。archive"などの名前の前にドットが付いたファイルは除外されます。これは、ベース名と拡張子 "archive"がないものとして扱われるためです。これらを含める場合は、
dir -af | Where {$_.BaseName -match "\.|^$"}
ここでは、一致パターンは、「リテラルドット、OR(|)BeginningOfString(^)の後にEndOfString($)(つまり空の文字列)」と表示します。ファイルは空のベース名との両方の拡張子を持つことはできないので、ファイルはドットで始まります。