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.txt
where 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_" 위치가 중요한지 잘 모르겠습니다).