임의의 숫자로 끝나는 로그 파일 캡처

임의의 숫자로 끝나는 로그 파일 캡처

".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](필수 ^는 아니지만 $암시적임 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위해 확장 정규식을 활성화하는 경우 패턴을 추가로 지정할 수 있습니다 .-Efind-regextype posix-extendedfind

find . -regextype posix-extended -regex '.*\.log([.-][0-9]+)+' # GNU
find -E . -regex '.*\.log([.-][0-9]+)+' # BSD

이는 on .log다음에 하나 이상의 .<number>또는 가 오는 것과 일치합니다 -<number>.

-regextype posix-extendedGNU가 없는 find정규식 은이맥스정규식, 표준 기본 정규식과 표준 확장 정규식의 일부 혼합(지원되지만 그룹화가 대신 +사용됨 )\(...\)(...)

표준 기본 정규식인 -EBSD 정규식 은 없습니다 .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경로가 다음으로 끝나는 파일을 즉시 선택합니다 . 즉, w/o.log.single_digit
  • OTW, "this"로 끝나는 파일 이름을 선택하면 .log. NUM anything NUM네트워크에서 파일 이름을 캡처하는 경향이 설정됩니다.
  • 위 캡처에서는 non number, non dash, or non dot파일 이름 부분에 이 포함된 파일이 거부됩니다. anything숫자로 시작하고 끝나는 추세를 따라야 합니다.
  • 이제 캡처에는 이러한 파일이 모두 포함되어 있으며 그 중 일부에는 , 및 anything만 포함되어 있습니다 . 마지막 제약 조건은 각각을 왼쪽과 오른쪽의 직접 이웃으로 가질 수도 있고 가질 수도 없습니다.digit(s)dot(s)dash(s)dotdash
  • PS 이 -name옵션은 파일 이름의 기본 이름 부분만 확인하며,
  • -name섹션은 이 기반으로 작동하므로 wildcard암시적으로 고정됩니다. 이는 일치하는 이름이 완전하다는 것을 의미합니다.

관련 정보