디렉토리가 있습니다 ~/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.*'