오늘 제가 작성한 CMS에서 작은 버그를 발견했습니다. 이제 동일한 파일 이름으로 서버의 모든 파일을 다시 작성하고 싶습니다. 그러나 특정 파일을 사용자 정의하는 일부 클라이언트가 있으므로 해당 파일을 모두 무시할 수는 없습니다.
일부 고객은 사용자 정의 파일을 가지고 있기 때문에 파일 크기를 확인해야 합니다.
파일 크기가 소스와 다른 경우 덮어써야 합니다. 파일 크기가 동일하면 파일을 건너뛰어야 합니다.
몇 달 전에 나는 하나의 소스에서 여러 파일을 덮어쓰는 방법에 대해 다소 비슷한 질문을 했습니다. 나는 또한 이 문제를 해결했습니다.
echo /home/*/*/phpthumb | xargs -t -n 1 cp -r /home/test/testuser/phpthumb/*
파일을 다시 쓰거나 건너뛰기 위해 if/else가 거의 없는 .sh 스크립트에서 이것을 사용할 수 있습니까? 그렇다면 어떻게 이를 달성할 수 있습니까?
내 유닉스 경험은 매우 평균적이므로 질문이 명확하지 않은 경우 언제든지 문의하십시오.
감사합니다.
답변1
나는 당신이 한 서버의 소스 파일 중 하나에서 소스 코드를 변경했고 수정 사항을 다른 사이트로 이식하고 싶다고 가정합니다. 그렇죠? 원본 파일의 복사본을 보관하고 있다면(프로젝트가 기억나지 않을 때 항상 보관합니다) 최고의 자산을 사용하세요 diff
. ::
diff -Nau old/file new/file > file.patch
SSH를 통해 모든 서버를 패치하는 데 사용할 수 있는 원본 소스 파일과 수정된 소스 파일 간의 차이점을 확인할 수 있습니다. 예를 들면 다음과 같습니다.
# See what's to be done, no action
cat file.patch | ssh server "patch -d <directory> --dry-run"
# Apply the patch if all seems good
cat file.patch | ssh server "patch -d <directory>"
변경되지 않은 복사본이 수정된 파일과 다른 디렉토리에 있는 경우 패치 헤더를 조정해야 할 수도 있습니다. 그러나 기본적으로 둘 다 동일한 디렉터리, file.php
즉 고정 파일과 file.php.orig
원본 파일 에 있는 경우 cd
웹 사이트 루트로 이동하여 diff
다음과 같은 명령을 실행합니다.
cd /home/www/htdocs/www.mysite.tld
diff -Nau some/deep/dir/file.orig.php some/deep/dir/file.php > /tmp/file.patch
다른 웹사이트의 루트 디렉터리에서:
# See what's to be done, no action
patch -d /home/www/htdocs/www.my.other.site.tld --dry-run < /tmp/file.patch
# Apply the patch if all seems good
patch -d /home/www/htdocs/www.my.other.site.tld < /tmp/file.patch
다른 유용한 인수는 입니다 -p
. diff
둘 다 patch
디렉토리 트리를 작업하여 수정 사항을 반복적으로 적용할 수 있습니다. 더 복잡한 패치를 단일 파일로 연결하여 빌드할 수도 있습니다. 사용 방법에 대한 자세한 내용은 patch --help
및를 참조하세요.diff --help
답변2
원래 질문을 그대로 바탕으로 이것이 원하는 것이지만 아래 내 의견을 참조하십시오. find
올바른 파일이 있는지 확인하기 위해 먼저 해당 섹션 자체를 시험해 볼 수도 있습니다 .
find /home -maxdepth 3 -mindepth 3 -path */phpthumb/filename ! -size xxxx |
xargs -t -n 1 cp /home/test/testuser/phpthumb/filename
내 의견에 따라 작동하고 동일한 크기를 바꾸려면 !
.
고쳐 쓰다
실제로 MD5를 비교하는 것이 더 좋은 방법입니다. 사용자 정의 파일 중 하나의 크기가 동일할 수 있으므로 더욱 강력합니다. 당신은 시도 할 수 있습니다:
original_md5=$(md5sum /path/to/original | awk '{print $1}')
echo /home/*/*/phpthumb/filename |
xargs md5sum |
grep "^$original_md5" |
awk '{print $2}' |
xargs -t -n 1 cp /home/test/testuser/phpthumb/filename
이렇게 하면 원본 파일과 일치하는 모든 파일이 대체됩니다. 귀하의 질문에서와 같이 이 작업을 그대로 수행하려면 -v
에 옵션을 추가하십시오 grep
. 또한 검색 경로에 공백이 있으면 이 답변 중 어느 것도 작동하지 않습니다(이전 질문 이후에 공백이 추가된 경우).