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}'

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

답변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.

관련 정보