
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-1
printf
이것이 가능한가?
답변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
.