
mySQL 비밀번호와 사용자 이름을 변경했으며 그에 따라 모든 PHP 스크립트의 연결 문자열을 바꿔야 합니다.
많은 PHP 파일 이름에 공백이 포함되어 있기 때문에 이 명령을 사용하는 데 문제가 있습니다.
"해당 파일 또는 디렉터리 없음" 오류가 발생하지 않고 이 명령이 작동하도록 하려면 무엇을 변경해야 합니까?
이것은 내가 사용하는 명령입니다:
pattern='mysql_connect("localhost", "olduser", "oldpwd")'
replacement='mysql_connect("localhost", "newuser", "newpwd")'
find . -name "*.php" | xargs -n 1 sed -i -e 's|$pattern|$replacement|g'
나는 xargs와 sed에 익숙하지 않습니다.이것비슷한 질문에 답해 보세요.
(mysql_connect 문을 php include 파일에 넣어두고 다음번엔 그냥 한곳에 바꿔줄 생각입니다.)
BASH를 사용하여 Ubuntu 14.04 LTS를 실행하고 있습니다.
답변1
다음과 같이 큰따옴표를 사용해야 합니다 NULL byte
.
find . -name '*.php' -print0 |
xargs -0 -n 1 sed -i -e "s|$pattern|$replacement|g"
아니면 간단한 것을 사용하세요for 루프:
for p in *php; do
sed -i -e "s|$pattern|$replacement|g" "$p"
done
쉘에서 올바르게 인용하는 방법을 배우는 것은 매우 중요합니다.
공백/메타 문자를 포함하는 모든 리터럴은 "큰따옴표"로 처리합니다.모든확장:
"$var"
,"$(command "$var")"
,"${array[@]}"
,"a & b"
.'single quotes'
코드나 텍스트$'s: 'Costs $5 US'
에 대해서는ssh host 'echo "$HOSTNAME"'
을 참조하십시오.
http://mywiki.wooledge.org/Quotes
http://mywiki.wooledge.org/Arguments
http://wiki.bash-hackers.org/syntax/words
답변2
다음과 같이 값을 교체하여 성공할 수 있었습니다.
find . -name "*.php" | xargs -n 1 sed -i -e 's/\"olduser\", \"oldpwd\"/\"newuser\", \"newpwd\"/g'