다음과 같이 crontab을 사용하여 Linux 파티션과 Windows 파티션 간의 두 디렉터리를 동기화하고 싶습니다.
24 9 * * * cp -r /home/fan/Data /media/T/Data
그러나 소스 디렉터리에서 누락된 파일을 복사하는 대신 원래 Data 디렉터리에 Data라는 디렉터리를 생성합니다. 이 문제를 완벽하게 해결하는 데 적합한 옵션을 cp 매뉴얼에서 찾을 수 없습니다. src에서 dir로 누락된 파일(대상 디렉터리에 있음)을 어떻게 복사할 수 있습니까?
그런데 copy 명령을 실행하려면 T 디스크를 마운트해야 할 것 같은데, 명령을 실행해야 할 때 자동으로 디스크를 마운트하려면 어떻게 해야 합니까(mount 명령은 루트로 실행해야 합니다).
명령에서 예외가 발생하는 경우 오류 메시지를 어떻게 받나요?
답변1
데이터 동기화를 위한 도구는 입니다 rsync
. 다음과 같이 디렉터리 수준에서 동기화하거나 디렉터리 내용만 동기화할 수 있습니다.
예
디렉터리 동기화24 9 * * * rsync -a /home/fan/Data /media/T/
콘텐츠 동기화
24 9 * * * rsync -a /home/fan/Data/ /media/T/Data/
첫 번째 예에서는 디렉터리를 Data
디렉터리에서 /home/fan
디렉터리로 동기화합니다 /media/T
. 두 번째 예에서는 Data
디렉토리 의 내용을 동기화합니다 /media/T/Data
.
추가 팁으로 다음 표기법을 사용하여 대상 디렉터리에 동기화합니다.
24 9 * * * rsync -a /home/fan/Data/ /media/T/Data/.
/.
내 명령을 읽을 때 rsync
나는 그것이 더욱 분명하다는 것을 알았습니다.
행동의 예
사용법은 rsync
아마도 새로운 사용자를 교육할 때 직면하게 되는 가장 혼란스러운 문제 중 하나일 것입니다.
견본:
$ tree home/fan/Data/
home/fan/Data/
|-- file1
|-- file2
|-- file3
|-- file4
`-- file5
1. dir 데이터의 내용을 동기화합니다.
$ rsync -a home/fan/Data/ media/T/
Data
에 내용을 넣었으니 참고하세요 T
.
$ tree media/T/
media/T/
|-- file1
|-- file2
|-- file3
|-- file4
`-- file5
0 directories, 5 files
2. 디렉터리 동기화
$ rsync -a home/fan/Data media/T/
디렉토리 Data
를 T
.
$ tree media/T/
media/T/
`-- Data
|-- file1
|-- file2
|-- file3
|-- file4
`-- file5
1 directory, 5 files
답변2
사용 rsync
:
24 9 * * * rsync -a /home/fan/Data/ /media/T/Data
/
소스 디렉터리 이름 끝에 추가 콘텐츠를 추가하면 rsync
전체 디렉터리 대신 콘텐츠를 복사하라는 메시지가 표시됩니다. rsync
또한 타임스탬프/크기가 동일한 파일(예: 99.99%의 경우 복사할 필요가 없는 파일) 복사를 방지합니다.
동일한 시스템에서 파일을 동기화하는 경우 작업 속도를 높이기 --inplace
위해 옵션을 사용하는 것도 고려할 수 있습니다. rsync
매뉴얼 페이지에서:
--inplace
This option changes how rsync transfers a file when its data needs to be
updated: instead of the default method of creating a new copy of the file and
moving it into place when it is complete, rsync instead writes the updated
data directly to the destination file.
이 옵션에는 장단점이 있지만 아마도 가장 큰 단점은 동기화가 중단되면 대상 파일이 처음부터 다시 시작해야만 해결할 수 있는 일관성 없는 상태에 있게 된다는 것입니다.
답변3
문제의 오류 메시지 부분을 해결하려면 시스템 명령 대신 cron에서 스크립트를 실행하도록 선택할 수 있습니다.
24 9 * * * /usr/local/sbin/sync_data.sh
/usr/local/sbin/sync_data.sh
루트 소유권과 실행 권한을 부여하여 파일을 으로 생성합니다 chown root:root /usr/local/sbin/sync_data.sh && chmod 0700 /usr/local/sbin/sync_data.sh
. 스크립트의 내용은 다음과 같습니다.
#!/usr/bin/env bash
if [[ $EUID -ne 0 ]]; then
echo "This script must be run as root." 1>&2
exit 1
fi
# [ ] vs [[ ]] : http://mywiki.wooledge.org/BashFAQ/031
dir_src="/home/fan/Data/"
dir_dst="/media/T/"
# A Boolean to know if running interactively or not
b_interactive=1
if [[ -v PS1 ]] ; then # The "-v PS1" method is for BASH 4.2+
$b_interactive=0 # Could also use [[ -z "$PS1" ]]
fi
# Send messages to console or syslog.
function notify() {
message="$1"
if [[ $b_interactive -eq 1 ]] ; then
echo "$message"
else
# eval combines args into a single string for execution...
eval $cmd_logger -p err "$0: $message"
fi
}
# If the mount point if not currently mounted...
if [[ "$(grep $dir_dst /proc/mounts)" = "" ]] ; then
# Try to mount the directory.
mount $dir_dst
# Send a message to console or syslog.
if [[ $? -ne 0 ]] ; then
notify("$0 failed to mount $dir_dst")
exit 1;
fi
fi
# Create a backup directory if it does not exist
if [[ -d $dir_dst ]] ; then
mkdir -p $dir_dst 2>/dev/null
fi
# A one-way sync to dir_dst, deleting files that no longer exist in DIR_SRC...
rsync -a --delete $dir_src $dir_dst &> /dev/null
# Check the return status of last command...
if [ $? -eq 0 ]; then
notify("$0: the rsync process succeeded.");
else
notify("$0: the rsync process failed.");
fi
unset dir_src
unset dir_dst
unset b_interactive
답변4
mkdir /office
mount /dev/xvdf /office
mkdir /home
mount /dev/xvdf1 /home
rsync -aHAXxSP /office /home