-name 또는 -regex를 사용하여 내 디렉터리를 찾을 수 없는 이유는 무엇입니까?

-name 또는 -regex를 사용하여 내 디렉터리를 찾을 수 없는 이유는 무엇입니까?

디렉토리가 있습니다 ~/Documents/machine_learning_coursera/.

주문하다

find . -type d -name '^machine'

아무것도 찾을 수 없음

나도 시도했다

find . -type d -regextype posix-extended -regex '^machine'

아무것도 일치하지 않고 문자열의 시작 부분과 일치합니다.

나는 또한 다음을 시도했습니다 -name.

find . -type d -regextype posix-extended -regex -name '^machine'

오류가 발생했습니다.

find: paths must precede expression: `^machine'

내가 여기서 뭘 잘못하고 있는 걸까?

답변1

find는 정규 표현식이 아닌 -name쉘/glob/와일드카드 패턴을 사용합니다 .fnmatch()

GNU find-regex비표준 확장은 정규식(기본적으로 이전 emacs 유형)을 사용하지만 -path파일 이름뿐만 아니라 전체 경로(예: 와일드카드도 사용하는 표준)에 적용됩니다(암시적으로 고정됨).

따라서 다음 유형의 파일을 찾으려면목차이름이 로 시작하는 machine경우 다음이 필요합니다.

find . -name 'machine*' -type d

또는:

find . -regextype posix-extended -regex '.*/machine[^/]*' -type d

-regextype posix-extended(특정 정규식의 경우 기본 정규식 엔진도 작동하므로 그럴 필요가 없습니다 .)

참고로 첫 번째 경기에서는이름또한 파일은 로케일에서 유효한 텍스트여야 하며, 두 번째 파일의 경우 전체 경로가 유효한 텍스트여야 합니다.

답변2

인수는 -name쉘 glob과 매우 유사하므로 일치하는 파일 이름의 시작과 끝에 암시적으로 바인딩되며 *더 많은 것이 있을 수 있음을 나타내야 합니다.

find . -type d -name 'machine*'

대안으로 -regex기록( 참조 man find)은 "검색하는 대신 전체 경로에서 일치”는 암시적으로 일치의 시작과 끝에도 바인딩되어 있으므로 다음이 필요합니다.

find . -type d -regextype posix-extended -regex '(.*/)?machine[^/]*'

당신이 "라고 말할 때또한 시도-name”, 매개변수가 필수라는 사실을 잊어버리고 해당 매개변수 -regex로 사용하다가 실수로 숨이 막혔습니다.-name'^machine'

답변3

-name, 테스트에서는 find정규식이 아닌 파일 glob을 사용합니다. glob 에는 특별한 의미가 없으므로 ^명령은 실제로 이름이 지정된 디렉터리를 찾습니다 ^machine. 이름이 다음으로 시작하는 모든 디렉토리를 찾는 것을 원합니다 machine.

find . -type d -name 'machine*'

활성화할 플래그가 아니기 때문에 다른 시도는 실패했습니다. 정규 표현식을 입력으로 전달해야 -regex합니다 . -name여기서는 아무것도 주지 않으니 find불평하세요. 또한 -regex테스트에서는 이름뿐만 아니라 전체 경로를 일치시키려고 시도합니다. 테스트로 수행하려는 작업을 수행하는 올바른 방법은 -regex다음과 같습니다.

find . -maxdepth 1 -type d -regex '.*/machine.*' 

관련 정보