![파일 이름에 공백이 포함된 경우 디렉터리의 모든 .php 파일에서 로그인 문자열을 검색하고 바꿉니다.](https://linux55.com/image/174234/%ED%8C%8C%EC%9D%BC%20%EC%9D%B4%EB%A6%84%EC%97%90%20%EA%B3%B5%EB%B0%B1%EC%9D%B4%20%ED%8F%AC%ED%95%A8%EB%90%9C%20%EA%B2%BD%EC%9A%B0%20%EB%94%94%EB%A0%89%ED%84%B0%EB%A6%AC%EC%9D%98%20%EB%AA%A8%EB%93%A0%20.php%20%ED%8C%8C%EC%9D%BC%EC%97%90%EC%84%9C%20%EB%A1%9C%EA%B7%B8%EC%9D%B8%20%EB%AC%B8%EC%9E%90%EC%97%B4%EC%9D%84%20%EA%B2%80%EC%83%89%ED%95%98%EA%B3%A0%20%EB%B0%94%EA%BF%89%EB%8B%88%EB%8B%A4..png)
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'