GNU find 명령에서 정규식 캡처 그룹을 사용할 수 있습니까?

GNU find 명령에서 정규식 캡처 그룹을 사용할 수 있습니까?

GNU find명령(GNU findutils 4.4.2), 정규식을 사용하여 파일을 검색할 수 있습니다. 예를 들어:

$ find pool -regextype posix-extended -regex ".*/mypackage-([a-zA-Z0-9.]+-[0-9]{1,2})-x86_64.pkg.tar.xz+"

추출이 가능한가요?캡처 그룹해당 표현식으로 정의하고 -printf인수에 사용합니까?

그래서 이라는 파일이 발견되면 그 부분을 표현식에 pool/mypackage-1.4.9-1-x86_64.pkg.tar.xz포함시키고 싶습니다 .1.4.9-1printf

이것이 가능한가?

답변1

당신이 사용하는 경우

find pool -regextype posix-extended \
    -regex ".*/mypackage-([a-zA-Z0-9.]+-[0-9]{1,2})-x86_64\.pkg\.tar\.xz" \
    -printf '%f\n' |
  grep -Eo '[a-zA-Z0-9.]+-[0-9]{1,2}'

(GNU grep도 마찬가지라고 가정), 모든 경로에서 작동해야 합니다. 정규식은 줄 바꿈을 허용하지 않으므로 비슷한 이름이 포함된 디렉터리와 일치하도록 만들 수 있는 방법이 없습니다.

답변2

l0b0의 훌륭한 답변에 대한 대안(더 짧지만 잠재적으로 약간 덜 효율적임):

(최근) GNU를 가정하면 다음과 같습니다 sed.

find pool -print0 |
  sed -znE 's|.*/mypackage-([[:alnum:].]+-[0-9]{1,2})-x86_64\.pkg\.tar\.xz$|\1|p'|
  tr '\0' '\n'

값비싼 부분은 당신이 가지고 있든 없든 find어쨌든 해야 할 나무 아래로 걸어가는 것입니다 . -regex그래서 여기에서는 대신 일치 및 보고를 수행하고 있습니다 sed.

관련 정보