"find -name" 명령에서 [.]*와 ".*"의 차이점은 무엇입니까?

"find -name" 명령에서 [.]*와 ".*"의 차이점은 무엇입니까?

.내 목표는 파일 시스템에서 점( )으로 시작하는 모든 파일이나 디렉터리를 찾는 것입니다 .gnupg. 그래서 저는 이런 명령을 생각해냈습니다.

find -name '.*'

온라인으로 확인해 보니 옵션의 매개변수 값 [.]*으로 대체를 사용해야 한다는 팁이 있었습니다 . -name결과가 동일해 보이는데 두 방법의 차이점은 무엇인가요?

답변1

전혀 차이가 없습니다. 시도하는 경우:

$ diff <(find -name '.*') <(find -name '[.]*')

어떤 결과도 얻지 못합니다. 이는 명령 출력이 동일함을 의미합니다. 나는 당신이 이 "힌트"를 문맥에서 벗어난 것으로 생각합니다. 의도는 다를 수 있습니다.

find매뉴얼 페이지 에서 :

-name 패턴
파일 이름(선행 디렉토리가 제거된 선행 디렉토리에 대한 경로)의 기본은 쉘 패턴 패턴과 일치합니다. *',기본 이름 시작 부분의 메타 문자( ?' 및 .'(findutils-4.2.2의 변경 사항))[]') match a

매개변수에서 문자 클래스로 해석된다는 의미 입니다 []. 그 안에 아무것도 없다는 점 -name을 제외하면 를 사용하지 않은 것처럼 .리터럴과 일치합니다 ..[]

답변2

glob 모드의 경우 차이가 없습니다. .*리터럴 마침표이고 그 뒤에 0개 이상의 문자가 옵니다. [.]*괄호 안의 문자(이 경우 리터럴 마침표여야 함) 뒤에 0개 이상의 문자가 옵니다.

비슷하게 생긴일반적인 표현 .*그리고 [.]*그것은 다릅니다. 첫 번째는 단일 문자가 0개 이상 발생하는 반면, 두 번째는 리터럴 마침표가 0개 이상 발생합니다. 정규식 메타 문자 이지만 .대괄호로 묶이지 않고 문자 그대로 처리됩니다.

답변3

어때요?

'\.[a-z]*'

표현식에는 리터럴 포인트 뒤에 임의 개수의 알파벳 문자가 와야 합니다. 빠른 테스트에서는 효과가 있는 것 같습니다. 점을 벗어나려면 백슬래시가 필요합니다. 일반적으로 "모든 문자"(다소)를 의미하는 메타 문자입니다.

내 표정은 다

find ~/ -name '\.[a-z]*'

편집: 숫자로 시작하는 도트 파일을 포함하려면 이것을 시도하십시오 '\.[a-z0-9]*'. 왜 그렇게 말할 수 없는지 잘 모르겠지만 '\.(.*)'누군가 제안이 있을 것이라고 확신합니다.

관련 정보