rsync --delete는 대상 디렉토리에서 대부분의 파일을 삭제했습니다. 이유는 무엇입니까?

rsync --delete는 대상 디렉토리에서 대부분의 파일을 삭제했습니다. 이유는 무엇입니까?

/etcrsync를 수행하는 동안 쉘 확장을 처리하지 않았기 때문에 폴더 에 있는 구성 파일이 모두 엉망이 되었습니다 .

rsync --progress --delete -avhHe ssh /etc/logrotate.d/{httpd,mariadb,php-fpm,ppp,wpa_supplicant,yum} [email protected]:/etc

내 생각에 문제는 '.' 다음 logrotate가 확장되고 이후에 일부 폴더가 /etc/httpd삭제되었습니다.

나는 이 실수를 올바르게 수행함으로써 교훈을 얻고 싶습니다. SSH를 사용하여 여러 파일을 rsync할 때 쉘 확장을 어떻게 방지합니까?

답변1

그 명령은 다음과 같이 요약됩니다.

rsync --delete --recursive /etc/logrotate.d/{httpd,mariadb,php-fpm,ppp,wpa_supplicant,yum} [email protected]:/etc

거기 .에는 문자 그대로의 의미가 있습니다. 이름의 일부이므로 문제가 되지 않습니다. 의 부분은 {}다음에 따라 달라질 수 있습니다.버팀대 확장: 쉼표로 구분된 각 부분은 확장되어 이전 인수 부분( /etc/logrotate.d/)에 연결됩니다. (무엇이든 있으면 다음에도 무엇이든 얻을 수 있습니다: a{BC}d로 확장됩니다 aBd aCd).

따라서 이 명령은 다음과 같습니다.

rsync --delete --recursive /etc/logrotate.d/httpd /etc/logrotate.d/mariadb /etc/logrotate.d/php-fpm /etc/logrotate.d/ppp /etc/logrotate.d/wpa_supplicant /etc/logrotate.d/yum [email protected]:/etc

또는 디렉터리 하나만 선택하여 짧게 하려면 다음과 같이 하세요.

rsync --delete --recursive /etc/logrotate.d/httpd [email protected]:/etc

rsync는 "from" 위치를 단일 엔터티로 해석합니다.그렇지 않다a로 끝나면 /주어진 대상 경로 내에서 해당 이름의 마지막 부분만 사용하여 새 파일이나 디렉터리를 만듭니다. 여기서는 입니다 httpd. 그래서 이것은 /etc/httpd대상에 을 만들고 /etc/logrotate.d/httpd그 내용을 복사합니다.

를 사용하면 --delete다음과 같습니다.모두 삭제저것아니었다/etc/logrotate.d/httpd소스에 있습니다 . 문제는 /etc/logrotate.d/httpd아마도 전혀 존재하지 않을 것이기 때문에 이를 복사하고 소스에 없는 파일을 삭제하는 것은해당 디렉토리의 모든 항목을 삭제합니다.. 존재한다면 그 내용은 와 동일하지 않으므로 /etc/httpd(거의) 모든 것이 삭제됩니다.

따라서 문제는 logrotate.d실제로 동일한 디렉토리를 /etc. 아마도 당신이 의미한 것은 다음과 같습니다:

rsync --progress --delete -avhHe ssh /etc/{httpd,mariadb,php-fpm,ppp,wpa_supplicant,yum} [email protected]:/etc

이는 복사 /etc/httpd및 해당 내용을 /etc/httpd대상 등에 복사합니다. 안에 내용을 복사하려면 logrotate.d경로 양쪽에 넣으세요.

당신이 유용하다고 생각할 수 있는 한 가지는-n또는 --dry-run옵션에게 rsync:

-n, --dry-run 변경 사항 없이 시험 실행을 수행합니다.

그러면 무슨 일이 일어날지 미리 볼 수 있지만 실제로 양쪽 끝에서 변경 사항이 적용되지는 않습니다. 이를 사용하여 실제 실행 전에 원하는 것이 무엇인지 확인할 수 있습니다.


에 제공한 인수에서 쉘 확장을 방지하는 방법을 물으셨습니다 rsync. 위와 같이 실제로는 문제가 발생한 것을 원하는 것이 아니라고 생각하지만, 꼭 필요한 경우 중괄호 확장은 따옴표 안에서 발생하지 않으므로 "a{BC}d"그대로 유지됩니다 a{BC}d.

관련 정보