파일 이름에 공백이 포함된 경우 디렉터리의 모든 .php 파일에서 로그인 문자열을 검색하고 바꿉니다.

파일 이름에 공백이 포함된 경우 디렉터리의 모든 .php 파일에서 로그인 문자열을 검색하고 바꿉니다.

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'

관련 정보