find로 directory 와 파일명 찾아 바꾸기 - 허접이라 잘 안되네요 고수님들의 도움 부탁드려요

muburi의 이미지

안녕하세요 고수님들!

쉽게 하위 디렉토리에서 특정 패턴이 있는 파일을 찾아서 파일명만 특정 패턴에서 다른 패턴으로만 바꾸고 싶습니다.

/user/test/abc/abc123ad.a 가 있다면 123 ->456으로 바꾸어 /user/test/abc/abc456ad.a

결론적으론 이렇게요

find . -type f -name "*123*" 이렇게 찾는거 까지는 되는데

xargs나 -exec를 써서 해보려고해도 잘되지 않네요

find . -type f -name "*123*" | xargs mv $1 <$1에서 특정패턴만 바뀐녀석>
이렇게 해보려 했는데 <$1에서 특정패턴만 바뀐녀석>를 모르겠네요...

고수님들의 솔루션을 부탁드려요

pogusm의 이미지

$ find *123* | sed -e 's/\(.*\)123\(.*\)/mv \1123\2 \1456\2/' | sh

요렇게 하면 될거 같은데요?

muburi의 이미지

와 잘 되네요 너무 감사드려요.

sed -e 's/\(.*\)123\(.*\)/mv \1123\2 \1456\2/' | sh 이부분이 잘 이해가 되지는 않네요

\(.*\)123\(.*\) : 123 들어간 패턴을 찾는 거 같은데요. 아마 (.*)인지요?
\1123\2 \1456\2/ : \1과 \2는 앞에서 들어간 \(.*\)를 순서대로 받는 것같은데 맞는 것인지요?

Fe.head의 이미지

(.*)123(.*) ==> 123 앞뒤의 글자들을 1, 2번 그룹화 시킵니다.
그룹화된걸 이용하는건 \1 (1번그룹화), \2 (2번그룹화) 이구요.

\1123\2 \1456\2 = (1번그룹)123(2번그룹) (1번그룹)456(2번그룹)
이렇게 되겠네요.

/user/test/abc/abc123ad.a 가 예가되면
1번그룹 "/user/test/abc/abc"
2번그룹 "ad.a"

\1123\2 \1456\2 = (1번그룹)123(2번그룹) (1번그룹)456(2번그룹)
대입해보면
/user/test/abc/abc123ad.a /user/test/abc/abc456ad.a

고작 블로킹 하나, 고작 25점 중에 1점, 고작 부활동
"만약 그 순간이 온다면 그때가 네가 배구에 빠지는 순간이야"

muburi의 이미지

감사드려요 그룹화에 대한 개념을 몰랐었는데 오늘도 한수 배우고 갑니다.
즐거운 하루 되셔요