두 디렉터리를 동기화하는 방법은 무엇입니까?

두 디렉터리를 동기화하는 방법은 무엇입니까?

다음과 같이 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/

디렉토리 DataT.

$ 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

관련 정보