쉘 명령에서. ?? *는 무엇을 의미합니까?


답변:


32

글롭 은 정규 표현식이 아닙니다. 일반적으로, 쉘은 당신이 glob로 인용하지 않은 명령 행에 입력 한 모든 것을 해석하려고 시도합니다. 쉘은 정규 표현식을 전혀 지원할 필요는 없습니다 (실제로는 더 많은 현대적인 것, 예를 들어 구문 의 =~정규식 일치 연산자 bash [[).

.??*글러브입니다. 리터럴 도트로 시작하는 파일 이름과 일치하는 .두 문자 (앞에 반드시 같은 것은 아님) ??, 그 뒤에 정규 표현식 ( [^/]*예 : 0이 아닌 문자)이 일치 /합니다.

쉘 경로 이름 확장 ( "글 로빙"의 전체 이름)에 대한 자세한 내용은 POSIX spec을 참조하십시오 .


10
추가 사항 : 이것은 특별한 항목을 제외하고 디렉토리의 모든 도트 파일과 일치하는 glob를 작성하려는 시도 .이며 ..일반적으로 아무것도하고 싶지 않습니다. 옳지 않습니다. .XX는 점이 아닌 다른 문자 인 ' ' 라는 이름의 항목은 선택하지 않습니다 . 나는 그것이 일치하는 단일 글로브 쓸 수 생각하지 않습니다 모든 제외 dotfile을 .등을 ..,하지만 당신은 두 가지로 그것을 할 수 있습니다 : tar zcvf dotfiles.tar.gz .[!.] .??*예를 들면.
zwol

@Zack : 설명해 주셔서 감사합니다. 나는 그것에 대해 의견을 게시했지만 삭제했습니다. 폴더와 패턴과 일치하는 다른 항목이 없음을 의미 ls .?하는 것과 동일한 값을 반환했습니다 . 이외의 모든 파일에 대해 수행했을 것 입니다. ls ...?.[^.].?..
SabreWolfy

2
@SabreWolfy POSIX 스펙을주의 깊게 읽으면 실제로 globs와 regex의 중요한 차이점입니다. 대괄호 표현식 [^abc]에서 정규 표현식 구문 [!abc]에서 glob 구문 과 동일 함을 의미 합니다 (즉 , globs ^로 대체 됨 !). 사용하여 [^abc]몇 가지 껍질이 정규식과 같은 의미를 다른 사람들이 치료 동안 사용하여 해석 할 수 있도록 POSIX, 그것은 무엇을 의미하는지 지정하지 않기 때문에 글로브에서 스타일의 구문은 매우 이식 할 수 없습니다 ^단지 리터럴 문자로.
jw013

1
@ jw013 : 자세한 내용 감사합니다. 나는 그 glob! = regexp :)를 기억해야한다
SabreWolfy

1
단지 나에게 발생 .[!.]온 리터럴로 남아있을 수 있습니다 tar어떤 파일이 일치하는 패턴이없는 경우 일반적인 경우에 명령 행. 일부 쉘을 사용하면 bash와 같은 동작을 제어 shopt -s nullglob하여 명령 줄이 일치하지 않으면 명령 줄에서 사라지지만 보편적 인 기능은 아닙니다.
zwol

8

.??*와일드 카드 ( 하지 정규 표현식, 그것은 그런 식으로 보이지만) 기간 (시작 파일 이름으로 변환 .이 하나 개의 문자 (다음), ??다음 다른 문자의 개수 (0 개 이상)를), 그리고 ( *).

어쩌면 파일 이름의 와일드 카드에 대한이 페이지 가 도움이 될 것입니다.


-1

다른 답변에 추가하기 위해 ?단일 문자는 단일 문자 파일 이름으로 변환 ??되며 두 문자 만있는 파일 이름과 일치합니다.

[root@mercy testdir_2]# ls
ion  it  r
[root@mercy  testdir_2]# ls ?
r
[root@mercy  testdir_2]# ls ??
it
[root@mercy 1 testdir_2]# ls ???
ion
[root@mercy  testdir_2]#

Downvoter, 제발 의견을 말씀해 주시겠습니까? 내가 틀렸다면 기꺼이 정정 해 드리겠습니다.
Sree

귀하의 답변이 질문에 완전히 답변하지 않았습니다.
SabreWolfy
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.