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}'
( grep
GNU도 마찬가지라고 가정), 모든 경로에서 작동해야 합니다. 정규식은 줄 바꿈을 허용하지 않으므로 유사한 이름이 포함된 디렉터리와 일치하도록 만들 수 없습니다.
답변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
.