답변:
파일 이름과 확장명은 Windows 95 및 NT 3.5에서 "긴 파일 이름"지원을 도입 한 이후 로 단일 필드 였으며 와일드 카드 일치는 전체 파일 이름에 대해 한 번에 수행됩니다. 결과적으로 점이없는 파일 이름을 가질 수 있으며 (파일은 드물지만 폴더 / 디렉토리에는 매우 일반적 임) 언뜻보기에 *.*
실제로는 해당 파일과 일치하지 않습니다.
와일드 카드가로 끝나는 경우 OS 에서 해당 부분을 무시합니다. 호환성 코드로 인해 이전 스크립트를 계속 사용할 *.*
수 있습니다 . (특별히 파일과 일치하기를 원한다면 그래서 으로 확장, 나는 당신이 필요로하는 것 같아요 그것을 위해.).*
*.?*
그러나 그것은 당신이 의지해야 할 것이 아닙니다. 최신 Windows 버전 용 스크립트를 작성하는 경우 MS-DOS 규칙이 아닌 해당 규칙을 따르십시오 . (윈도우 NT의로, 박쥐 스크립트가되는 것에주의 하지 더 이상하지만하여 MS-DOS에 의해 해석 cmd.exe
, 고유의 Win32 프로그램을.)
Linux 및 기타 다양한 Unixen에서 이름과 확장자는 처음부터 분리 된 적이 없으며 작동 하는 데 특별한 마법 이 없으므로 유일하게 선택하는 것이 합리적입니다.*.*
*
*
파일 이름 만 일치 합니다. 두 가지와 호환되는 '안전한'방법은을 사용하는 것 입니다. **
*
(수행 기본적으로 (A로 시작하는 숨겨진 파일 이름과 일치하지) .
).
그것은 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 *.*
도 확장하지 않고 파일 (틀림없이 잘못 아직 기대를 보존) 일치.
이런 식으로 요약하는 것이 안전하다고 생각합니다.
FindFirstFile
자체는 사용자 모드 (kernel32.dll 및 ntdll.dll은 모두 사용자 모드 라이브러리-커널이 아닌 Win32 하위 시스템의 일부 임)이지만 실제로는별로하지 않습니다.
mmv "fred.*" "tom.#1"
. (대체는을 #1
대신하여 사용 *
하므로 필드를 재정렬 할 수 있다는 장점이 있습니다). mmv
대부분의 시스템에는 기본적으로 설치되지 않지만 다른 배치 이름 바꾸기 도구가 종종 있습니다. 이에 대한이 기사 및 stackoverflow.com/questions/417916/how-to-do-a-mass-rename을 참조하십시오 .
*
그리고*.*
지금은 동등cmd
내부 명령과 현대 명령 줄 유틸리티, 기능과 일치하는 이전 파일을 사용할 수 있습니다 파일 마스크 매개 변수를 사용하고, 그들을 위해 마스크는 해당되지 않습니다 일부 오래된 유틸리티.