CMD : *. * 또는 그냥 *?


47

1990 년대로 돌아가서 " *.*"를 사용 하여 MS-DOS에서 파일 이름을 나타내지 만 *요즘에는 " " 만 사용하여 더 많은 스크립트를 보았습니다 . 실제로 어떤 것을 사용합니까?


9
그것은 그 사실이지만 *그리고 *.*지금은 동등 cmd내부 명령과 현대 명령 줄 유틸리티, 기능과 일치하는 이전 파일을 사용할 수 있습니다 파일 마스크 매개 변수를 사용하고, 그들을 위해 마스크는 해당되지 않습니다 일부 오래된 유틸리티.
AFH

@AFH 나는 토큰이 같다고 생각하지 않습니다. *.*토큰은 확장명이 파일을 리턴해서는 안됩니다.
tuskiomi

1
@tuskiomi- 확장명 *.* 이없는 파일을 반환 하지 않아야 한다는 데 동의 합니다. 불행히도 그렇지 않습니다. Grawity의 답변을 참조하십시오.
AFH

답변:


65

파일 이름과 확장명은 Windows 95 및 NT 3.5에서 "긴 파일 이름"지원을 도입 한 이후 로 단일 필드 였으며 와일드 카드 일치는 전체 파일 이름에 대해 한 번에 수행됩니다. 결과적으로 점이없는 파일 이름을 가질 수 있으며 (파일은 드물지만 폴더 / 디렉토리에는 매우 일반적 임) 언뜻보기에 *.*실제로는 해당 파일과 일치하지 않습니다.

와일드 카드가로 끝나는 경우 OS 에서 해당 부분을 무시합니다. 호환성 코드로 인해 이전 스크립트를 계속 사용할 *.* 있습니다 . (특별히 파일과 일치하기를 원한다면 그래서 으로 확장, 나는 당신이 필요로하는 것 같아요 그것을 위해.).**.?*

그러나 그것은 당신이 의지해야 할 것이 아닙니다. 최신 Windows 버전 용 스크립트를 작성하는 경우 MS-DOS 규칙이 아닌 해당 규칙을 따르십시오 . (윈도우 NT의로, 박쥐 스크립트가되는 것에주의 하지 더 이상하지만하여 MS-DOS에 의해 해석 cmd.exe, 고유의 Win32 프로그램을.)


Linux 및 기타 다양한 Unixen에서 이름과 확장자는 처음부터 분리 된 적이 없으며 작동 하는 데 특별한 마법 이 없으므로 유일하게 선택하는 것이 합리적입니다.*.**


14
"확장자를 가진 파일을 필터링하기 어렵게 만들자! 예!" 익명 Microsoft 개발자
John Hamilton

50
"모든 사람을위한 수백만 개의 기존 배치 스크립트를 중단하자! 예!" -마이크로 소프트 개발자 없음
grawity

3
ISTR의 일부 DOS 버전 에서는 확장자가 없는* 파일 이름 만 일치 합니다. 두 가지와 호환되는 '안전한'방법은을 사용하는 것 입니다. **
Random832

8
영업 이익은 윈도우에 관한 것입니다,하지만 당신은 리눅스 언급 한 이후 : 일부 쉘 (예를 들어 배쉬)에서, *(수행 기본적으로 (A로 시작하는 숨겨진 파일 이름과 일치하지) .).
Florian Brucker

4
"OS 레벨"의 일부 값의 경우 ... Windows의 쉘 (탐색기) 개념이기도합니다. 커널은 실행 파일의 .exe 나 다른 것을 신경 쓰지 않습니다. Windows 탐색기가 Linux의 Nautilus보다 "OS 수준"인지 여부는 논쟁의 여지가 있습니다.
grawity

11

그것은 Bourne 쉘, bash는, KSH, zsh을, 등 (글로브의 같은 문자의 와일드 카드 확장 할 같은 unixy / posixy 쉘 것을 언급 아마 가치 *, ?, [range], [!range]중괄호 및 확장 globs와 같은 다른 확장은) 인수 목록을 컴파일 하기 전에 명령 실행됩니다. 따라서 이러한 확장은 인수가 될 수있는 명령이 아닌 쉘에 의해 수행됩니다.

즉, 쉘은 무엇에 대한 책임 *, *.*로 확장

 $ ls
 file.csv  file.doc  file.pdf  file.txt  file.xlsx  zz-file-without-extension

 $ (set -xv; foo *)   # is actually expanded to the following
   + foo file.csv file.doc file.pdf file.txt file.xlsx zz-file-without-extension

 $ (set -xv; foo *.*)  # note this does not match `zz-file-without-extension`
   + foo file.csv file.doc file.pdf file.txt file.xlsx

CMD ( 글로벌 쉘 유틸리티 의 경우와 유사 )는 실행 된 명령에 글로브 문자를 그대로 전달하므로 확장은 쉘이 아닌 명령 / 유틸리티의 책임입니다. 그래서 궁극적으로 무엇 *.*이나 *수단 것은이 규칙에 (여부)을 준수하기 위해 떠나는 유틸리티에 남아 - 왜 CMD의 유틸리티와 같은 dir *.*도 확장하지 않고 파일 (틀림없이 잘못 아직 기대를 보존) 일치.

이런 식으로 요약하는 것이 안전하다고 생각합니다.

  • CMD에서는 유틸리티에 따라 다릅니다.
  • PowerShell에서 WildCardPattern 클래스를 사용하는 유틸리티 는 일관된 posixy 동작을 제공합니다.

또 다른 차이점은 CMD에서 대부분의 프로그램은 실제로 원시 와일드 카드를 커널 (FindFirstFile)로 전달하는 반면, Linux에서는 glob가 전체 목록을 가져와 사용자 공간에서 필터링하는 것입니다.
grawity

백만 개의 파일이있는 디렉토리에서 *를 실행하면 명령에 너무 많은 매개 변수가 표시됩니다. 최악의 경우 목록의 꼬리를 자동으로 삭제할 수 있습니다. 이러한 경우 다른 프로세스가 목록을 읽을 수 있도록 둘 이상의 명령을 파이프하거나 파일 이름 목록을 파일에 저장해야합니다.
Enric Naval

3
@grawity보다 정확한 필터링은 Windows의 파일 시스템 드라이버에 의해 수행됩니다. 이것은 네트워크 파일 시스템에서 특히 유용합니다 (특히 원격 파일 시스템에 대해 8kb 라인을 실행할 수있을 때 다시 돌아가지만). 또한 명시 적으로 지원되는 검색뿐만 아니라 임의 검색을 수행 할 수 없음을 의미합니다. 이것의 의미는 Raymond Chen의 블로그에서 여러 번 탐색되었습니다. FindFirstFile자체는 사용자 모드 (kernel32.dll 및 ntdll.dll은 모두 사용자 모드 라이브러리-커널이 아닌 Win32 하위 시스템의 일부 임)이지만 실제로는별로하지 않습니다.
Luaan

아아, 나는 FindFirstFile이 비슷한 이름의 syscall을 직접 직접 감싼다는 인상을 받았다.
grawity

1
@cup : 따옴표 만 사용하여 쉘이 glob를 확장하지 못하도록하여 명령에 전달할 수 있습니다. 예 mmv "fred.*" "tom.#1". (대체는을 #1대신하여 사용 *하므로 필드를 재정렬 할 수 있다는 장점이 있습니다). mmv대부분의 시스템에는 기본적으로 설치되지 않지만 다른 배치 이름 바꾸기 도구가 종종 있습니다. 이에 대한이 기사stackoverflow.com/questions/417916/how-to-do-a-mass-rename을 참조하십시오 .
Peter Cordes
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.