`dir *. *`가 왜 모든 파일과 폴더를 제공합니까? SAP 28-03-2017

내가 실행 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명령은 다음과 같은 경우에 발생합니다.

  1. 파일 또는 폴더 이름에서 마침표 (.)를 문자로 사용할 수 없습니다.
  2. 파일 및 폴더 이름은 이름으로 8 자, 확장명으로 3 자로 제한되었습니다

따라서 표준에 따라 이름과 확장자는 무엇이든*.* 의미 합니다 . 그것은 의미하지 않았다 포함 된 문자열을 “.”를, 또는 이전 또는 이후에 문자가있을 수도 있고 없을 수도 있습니다 이는 “.” .

Microsoft 정책은 이전 버전과의 호환성을 유지하고 있습니다. 따라서 그 해석 *.*은 유지됩니다.

그러나 Windows PowerShell에서 “.”이 포함 된 문자열을*.* 의미 하며 “.”앞뒤에 문자가 있거나 없을 수 있습니다. .


답변

왜 그런 겁니까?

와일드 카드 기사 에서 ” 왜 그 이유는 무엇입니까? “에 대한 답변을 찾을 수 있습니다 .

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 개 이상의 문자와 일치합니다 (다음 규칙 참조). 욕심없는 와일드 카드는 마스크의 나머지 부분을 일치시키는 데 필요한만큼의 문자를 자유롭게 일치시킬 수 있습니다.

  • *.마스크 끝에서 {dot}을 제외한 0 개 이상의 문자와 일치합니다. 실제로, 규칙은 *와 터미널 {dot} 사이에 임의의 수의 {dot} 및 {space} 문자로 적용됩니다. 이 용어의 정규식은"[*][. ]*[.]$"

  • ?{dot}을 제외하고 0 또는 1 개의 문자를 찾습니다. 0 문자와 일치하는 유일한 시간은 이름의 끝 또는 {dot} 앞의 위치와 일치 할 때입니다. 물음표는 여러 문자와 일치시키기 위해 두 번 이상 사용될 수도 있습니다.

시사점 . 파일 / 폴더 이름 의 마지막 {dot}은 기본 이름과 확장자를 구분 합니다. 그래서

  • dir *.확장명없는 모든 항목을 표시 하고
  • dir *.*확장자가 0 자 이상인 모든 항목을 표시 합니다 .

엄밀히 말하면 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연결 BaseName되어 Extension 있지 않은 직관적 인 추측 . 다음 스크립트는 핵심 기능을 사용 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 "<.*>"


답변

점이있는 파일 만 나열 할 수있는 방법이 있습니까?

문서화되지 않은 와일드 카드를 사용하여 파일 이름을 점과 일치시킬 수 있습니다.이 이름 <은 기본 이름의 0 개 이상의 문자 시퀀스 또는 확장자의 0 개 이상의 문자 시퀀스와 일치합니다.

dir "<.<"

그 기억 <이 인용하거나 명령 쉘에서 패턴을 사용할 때마다 이스케이프 할 필요가 있으므로, 또한 메타 문자입니다.


답변

명령 줄 인터프리터는 ” . “을 “모든 확장명”을 가진 “모든 기본 파일 이름”으로 표시합니다. 빈 확장명은 여전히 확장명 이므로 일치하고 목록과 함께 반환됩니다. 다른 사람들이 설명했듯이, 이것은 이전 버전의 Windows 및 MS-DOS의 숙취입니다.

PowerShell을 사용하여보고 싶다면이 파일을 찾는 것이 훨씬 쉽습니다. PowerShell에서 “dir”은 “Get-ChildItem”cmdlet의 별칭입니다.

확장자가있는 모든 파일 (디렉토리 / 폴더가 아님)을 찾으려면 (예 : “myFile.txt”이지만 “FileWithNoExt”는 아님) :

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

“-af”스위치는 반환 파일을 파일로만 제한하는 “-File”의 줄임말입니다. “-ad”는 디렉토리 만 가져옵니다. “\.” “리터럴 도트 문자”를 의미합니다. 백 슬래시가 없으면 점은 표준 정규식에 따라 모든 문자와 일치합니다.

확장명없이 이름에 점이있는 모든 파일을 가져 오려면 확장명 (예 : “myDocument_v1.1.doc”이지만 “myfile.txt”는 아님) :

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

그러나 “.archive”와 같이 이름이 앞에있는 점이있는 파일은 제외됩니다. 기본 이름이없고 확장자가 “아카이브”인 것으로 취급되기 때문입니다. 이것들을 포함 시키려면 :

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

여기서 일치 패턴은 “리터럴 도트, OR (|) BeginningOfString (^) 뒤에 EndOfString ($)”(즉, 빈 문자열)이 표시됩니다. 파일은 빈 기본 이름 확장명을 모두 가질 수 없으므로 점으로 시작하는 파일을 찾습니다.


답변

당신이 위의 명령을 입력하면, 여기에 (.) * *이 다음에 뒤에 도트 (이 문자의 순서를 의미 와일드 카드입니다) 쇼로 같은 이름을 가진 모든 파일 해석 될 수 문자 (모든 순서를 ). 자 (모든 시퀀스) 상기있는 임의의 확장에서 모든 파일을 표시하는 수단.


답변