전체 경로를 반환하는 동안 기본 이름이 패턴과 일치하는 파일을 찾습니다.

전체 경로를 반환하는 동안 기본 이름이 패턴과 일치하는 파일을 찾습니다.

find결과를 정규식과 일치시켜야 합니다 . 파일은 다음과 같습니다:

/path/1/file1.001.txt
/path/1/file2.001.txt
/path/1/file1.001
/path/2/file3.002.txt
/path/2/pure_file3.002.txt

등.

xxx.txtwhere is 3자리 숫자 로 끝나는 모든 디렉토리의 모든 파일을 일치시켜야 하며 xxx, 앞에 단어가 없는 파일 이름만 일치시켜야 합니다 pure_. 또한 전체 경로가 반환되어야 합니다.

다음 파일을 제외한 모든 작업을 수행했습니다 pure_.

find /path/ -mindepth 1 -maxdepth 2 -type f | grep -P '.*\.[0-9]{3}.txt' 

나는 시도했다:

find /path/ -mindepth 1 -maxdepth 2 -type f | grep -P '.+(?!pure).*\.[0-9]{3}.txt' 

하지만 내가 말한다면 /path/1/:

ls -1 | grep -P '^(?!pure).*\.[0-9]{3}.txt'

반면에 다음 파일은 올바르게 제외됩니다.

ls -1 | grep -P '(?!pure).*\.[0-9]{3}.txt'

확실히.

그래서 그것은 아마도 로 시작하지 않는 전체 경로에서 어떻게 일치시킬 것인가에 달려 있을 것입니다 pure_. 나는 정규식을 충분히 이해하지 못하고 이것은 내가 결코 이해하지 못했던 원자성을 둘러보는 것과 관련이 있을 수 있습니다.

답변1

find정규식 일치 없음:

find /path -type f ! -name 'pure_*' -name '*[0-9][0-9][0-9].txt'

/path이름이 세 pure_자리 숫자와 .txt.

답변2

find로 시작하는 파일을 제외 하도록 지시하거나 다음 표현식을 사용 하여 수행 pure_할 수 있습니다 .grep-regex

find ./path -mindepth 1 -maxdepth 2 -type f ! -name 'pure_*' -regex '.*\.[0-9][0-9][0-9].txt$'

예제의 모의 디렉터리에 있는 복사본을 사용하면 다음과 같은 결과를 얻을 수 있습니다.

./path/1/file1.001.txt
./path/1/file2.001.txt
./path/2/file3.002.txt

답변3

find -type f | egrep "[0-9]{3}\.txt$" | grep -v pure_

find현재 디렉터리에서 시작하는 파일을 찾습니다 .

확장 정규식을 적용하여 egrep줄 끝에 추가된 세 자리 ".txt"를 필터링합니다(점은 이스케이프 처리해야 하며, 그렇지 않으면 "Atxt"도 일치함).

"pure_" 문자열이 포함된 ( ) 행을 필터링합니다 grep( -v"pure_" 위치가 중요한지 잘 모르겠습니다).

관련 정보