Linux

rsync 僅來自指定子目錄的某些文件類型

  • January 7, 2021

這是我的源目錄結構:

../openwrt
../openwrt/BackupOfPackages
../openwrt/BackupOfSettings
../openwrt/BackupOfImages

我想使用 rsync 將其鏡像到目標目錄。我只想 rsync 三個子目錄中的文件,我只想同步帶有副檔名的文件:

.installedBackupOfPackages文件夾

.img.gzBackupOfImages文件夾

.tar.gzBackupOfSettings文件夾

在我的源目錄中,我在 basedir“openwrt”和每個子目錄中混合了各種文件。但是如上所述,我只想從特定的子目錄同步特定的文件類型。

在此處輸入圖像描述

這是我的 rsync 命令:

openWrtPath="/mnt/usb/openwrt/"  
ncpPath="/media/myCloudDrive/openwrt"

rsync -vvrit --include='/' --include='BackupOfSettings/' --include='BackupOfSettings/**.tar.gz' --include='BackupOfPackages/' --include='BackupOfPackages/**.installed' --include='BackupOfImages/' --include='BackupOfImages/**.img.gz' --exclude='/*' --delete --delete-excluded $openWrtPath ncp:$ncpPath

當我執行命令時,這就是它顯示和隱藏的內容。它從 basedir 中正確隱藏 opkg.installed 和“新文件夾”,但不會隱藏 BackupOfSettings 和 BackupOfImages 等中的 .installed 等文件類型。

在此處輸入圖像描述

Rsync 幾乎可以同步從源到目標的所有內容? 在此處輸入圖像描述

如何將我的 rsync 命令更改為僅將具有副檔名的文件複製:

.installedBackupOfPackages文件夾

.img.gzBackupOfImages文件夾

.tar.gzBackupOfSettings文件夾,

即:正確隱藏不應從各種子目錄傳輸到目標的任何文件類型,即使它們存在於源機器上的那些子目錄。

更新

在我發布之後,我想我找到了答案..當我改變它時--exclude='/*'--exclude='*'它似乎可以按我的意願工作。有人可以解釋這兩個排除之間的區別嗎?

是否'/*'意味著:“排除 basedir (openwrt) 中的所有內容,這不適用於 basedir 的子目錄”

謝謝!

是否'/*'意味著:“排除 basedir (openwrt) 中的所有內容,這不適用於 basedir 的子目錄”?

是的,/是傳輸目錄的根目錄並/*匹配那裡的所有內容(文件和目錄)。

您可以將命令中的包含縮短為:

rsync -ai \
 --include='BackupOf***/' \
 --include='BackupOfImages/**.img.gz' \
 --include='BackupOfSettings/**.tar.gz' \
 --include='BackupOfPackages/**.installed' \
 --exclude='*' \
 --delete --delete-excluded \
 "$openWrtPath" ncp:"$ncpPath"

這裡--include='BackupOf***/'的意思是包括所有以開頭的目錄BackupOf及其子目錄(例如BackupOfImages/sub1/sub2/)。如果您不需要包含這些子目錄,請將其更改為BackupOf*/,您也可以將兩個**文件副檔名更改為一個*

-a我使用了包含-t和其他選項的存檔模式,並引用了這兩個變數。

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