Mount

如何同步兩個目錄?

  • May 29, 2020

我想使用 crontab 在我的 linux 分區和 windows 分區之間同步兩個目錄,如下所示:

24 9 * * * cp -r /home/fan/Data /media/T/Data

但它會在原始數據目錄中創建一個名為 Data 的目錄,而不是從源目錄中複製失去的文件。我在 cp 手冊中找不到合適的選項來完美解決這個問題。如何將失去的文件(它們確實存在於目標目錄中)從 src 複製到 dir。

順便說一句,似乎需要掛載T盤才能執行複制命令,當我需要執行命令時如何自動掛載磁碟(掛載命令應該以root身份執行)。

如果命令有異常,我怎樣才能得到錯誤消息?

用於同步數據的工具是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.同步目錄數據內容

$ 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

使用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.

這個選項雖然有利也有弊,但最大的缺點可能是如果同步中斷,目標文件將處於不一致狀態,只能通過重新開始來修復。

引用自:https://unix.stackexchange.com/questions/123394