문자열 치환하기 전에 백업하기

lovethecorners의 이미지

지금현재 많은수의 파일들의 일부분만을 문자열 치환하려합니다. 그런데, 문자열 치환하기 전에 해당파일을 백업하고 문자열 치환을 하려고 하는데요,

find ./ -name '*.pl' -type f -exec perl -pi -e 's/aaa/zzz/g' {} \;

이렇게 하면 문자열이 치환되는것은 알겠는데, 위 작업을 하면서 동시에 백업후 해당 문자열 치환하는 방법은 없나요?

flyingykk의 이미지

펄 명령 줄 때
perl -pi.bak -e 's/aaa/zzz/g'
처럼 하면 될 것 같습니다. (.bak 추가)

perl -h 하면 (불친절한) 설명이 나옵니다.

lovethecorners의 이미지

다음과 같은 해결책을 찾았습니다...

egrep -i -d skip -l -r 'aaa' * | xargs perl -i'*.bak.02012006' -pe 's(aaa)(zzz)ig'
lovethecorners의 이미지

더 좋은 방법입니다....

find /home/www -name '*.pl' -type f -print0 | xargs -0 grep -n -l "aaa" | xargs perl -i'*.bak.02012006' -pe 's(\aaa)(\zzz)ig'

지금까지 pipe를 두개 이상을 쓴다라는것을 생각못했습니다....-_-;

flyingykk의 이미지

제 답변의 의도는 find 명령 중 perl 부분을 고치면 어떨까 하는 것이었습니다. 처음에 사용하셨던 명령에 '.bak'만 추가하면 되지 않을까 하는 뜻이었습니다. (몰랐는데 '*.bak'도 가능하더군요.)
find . -name '*.pl' -type f -exec perl -pi.bak -e 's/aaa/zzz/g' {} \;
제가 시험해 보니까 생각대로 동작하는 것 같던데. 혹시 하시려는 것을 제가 잘못 이해했는지...