
".log.[모든 숫자]로 끝나는 모든 로그를 캡처하려고 합니다.
그래서 저는 이 구문을 만듭니다.
find . -type f -regex '^.log.*[0-9]$' -print
command does not give any output
하지만 다음과 같이 파일이 캡처되지 않습니다(예상 결과).
controller.log.2018-01-03-01
server.log.2017-10-31-03
server.log.2018-01-23-11
server.log.2018-04-06-17
server.log.2018-07-07-05
controller.log.2018-01-03-02
log-cleaner.log.10
server.log.2017-10-31-04
server.log.2018-01-23-12
server.log.2018-04-06-18
server.log.2018-07-07-06
controller.log.2018-01-03-03
log-cleaner.log.2
server.log.232.434
내 구문에 무슨 문제가 있습니까?
답변1
-regex
(GNU 확장은 요즘 다른 구현에서도 인식되지만 find
큰 차이점이 있음) -path
와일드카드 대신 정규 표현식을 사용한다는 점만 제외하면 비슷합니다. 이름뿐만 아니라 전체 파일 경로와 일치합니다.
따라서 .*\.log.*[0-9]
(필요하지 않거나 ^
' s $
로 암시적임 )는 on과 일치 하지만 , 캡처된 .find
-regex
./dir/foo.log-3
./foo.logic/file.bz2
.*
ic/file.bz
-name
파일과 일치합니다이름단, 와일드카드를 사용하지만 정규식 대응 항목은 없습니다. 여기에서 이름이 .log
숫자로 끝나고 끝나는 파일의 경우 정규 표현식이 필요하지 않습니다 -name '*.foo*[0-9]'
.
을 사용하면 정규식으로도 동일한 작업을 수행할 수 있습니다. 즉 , 과 마지막 숫자 -regex '.*\.log[^/]*[0-9]'
사이의 부분에 아무것도 포함되지 않도록 하여 파일 이름만 일치하도록 할 수 있습니다..log
/
를 사용 하면 특히 일부 BSD 또는 GNU를 -regex
사용하여 확장 정규식을 활성화하는 경우 패턴을 지정할 수 있습니다 .-E
find
-regextype posix-extended
find
find . -regextype posix-extended -regex '.*\.log([.-][0-9]+)+' # GNU
find -E . -regex '.*\.log([.-][0-9]+)+' # BSD
여기서는 on .log
다음에 하나 이상의 .<number>
or 가 일치합니다 -<number>
.
-regextype posix-extended
GNU find
의 정규 표현식이 없으면이맥스regexps, 표준 기본 정규 표현식과 표준 확장 정규 표현식 사이의 일종의 하이브리드입니다( 지원 +
하지만 그룹화는 \(...\)
대신 을 사용함 (...)
).
-E
BSD 정규 표현식이 없으면 find
표준 기본 정규 표현식입니다.
답변2
노력하다,
find . -type f -regex ".*\.log\..*[0-9]$"
./server.log.2018-01-23-12
./server.log.2018-07-07-06
./log-cleaner.log.2
./log-cleaner.log.10
./server.log.232.434
./server.log.2018-01-23-11
./server.log.2017-10-31-03
./controller.log.2018-01-03-01
./server.log.2018-04-06-17
./log-cleaner.log.1
./controller.log.2018-01-03-03
./server.log.2018-04-06-18
./controller.log.2018-01-03-02
./server.log.2018-07-07-05
./server.log.2017-10-31-04
- 우리는 탈출해야 해
.
답변3
.
"log" 뒤에 숫자, , 및 만 있으면 -
다음도 작동할 수 있습니다.
find . -type f -regex ".*[.]log[-.0-9]*$"
답변4
다음 방법을 사용하지 않고 다음 방법을 사용하여 파일을 검색할 수 있습니다 non-GNU
find
.
find . -type f \
\( -name '?*.log.[0-9]' -o \
\( \
-name '?*.log.[0-9]*[0-9]' \
! -name '?*.log.?*[!0-9.-]*?' \
! -name '?*.log.?*[.-][.-]*?' \
\) \
\) \
-print;
이것이 하는 일은 포착된 파일 이름의 다층 필터링을 수행하고 점진적으로 포착을 축소하고 필요한 것에 초점을 맞추는 것입니다. 정확하게 말하자면:
basename
즉, 경로가 없이 끝나는 파일을 즉시 선택하십시오..log.single_digit
- OTW, 다음으로 끝나는 항목을 선택하세요.
.log.
NUM
anything
NUM
이렇게 하면 파일 이름이 그물에 걸릴 경향이 설정됩니다. - 위의 캐치 중에서 파일 이름 부분
non number, non dash, or non dot
에 있는 항목을 거부하십시오 .anything
숫자로 시작하고 끝나는 경향을 준수해야 합니다. - 이제 우리의 캐치에는 부분이 , 및
anything
로만 구성된 모든 파일이 있습니다 . 마지막 제약은 또는 가 각각을 왼쪽과 오른쪽 모두에 대한 바로 이웃으로 가져서는 안 된다는 것입니다.digit(s)
dot(s)
dash(s)
dot
dash
- PS
-name
옵션은 파일 이름의 기본 이름 부분만 확인하고, -name
부분은 기반으로 작동하므로wildcard
암시적으로 고정됩니다. 즉, 일치하는 이름이 가득 찼음을 의미합니다.