Linux
rsync:使用過濾器排除頂級目錄但包括其一些子目錄
我想用rsync備份我的
/home
目錄。我已閱讀 rsync 的手冊頁並決定為此任務使用過濾規則。我想要實現的目標: 排除目錄中的所有文件和目錄,
Repos
但保留所有pull_all.sh
文件和output
目錄——無論它們位於Repos
目錄中的什麼位置。到目前為止,我最終得到了以下過濾器列表,但這僅備份
pull_all.sh
文件而不備份output
目錄:# Files prefixed with "+ " are included. Files prefixed with "- " are excluded. # # The order of included and excluded files matters! For instance, if a folder # is excluded first, no subdirectory can be included anymore. Therefore, # mention included files first. Then, mention excluded files. # # See section "FILTER RULES" of rsync manual for more details. # Included Files # TODO: This rules do not work properly! + output/*** + pull_all.sh - Repos/** # Excluded Files - .android - .cache ...
我在腳本中使用過濾器列表
run_rsync.sh
:#!/bin/bash date="$(date +%Y-%m-%d)" hostname="$(hostname)" # debug_mode="" # to disable debug mode debug_mode="--list-only" # Note: With trailing "/" at source directory, source directory is not created at destination. rsync ${debug_mode} --archive --delete --human-readable --filter="merge ${hostname}.rsync.filters" --log-file=logfiles/$date-$hostname-home.log --verbose /home backup/
不幸的是,現有的 StackExchange 執行緒並沒有解決我的問題:
- https://stackoverflow.com/questions/8270519/rsync-exclude-a-directory-but-include-a-subdirectory
- 使用 Rsync 包含和排除選項來包含目錄和子目錄,但排除子目錄中的文件
這裡出了什麼問題?
$$ Update $$以下是主目錄的外觀範例以及要保留哪些文件以及要忽略哪些文件:
user@hostname:~$ tree /home/ | head /home/ └── user ├── Desktop -> keep this │ ├── file1 -> keep this │ └── file2 -> keep this ├── Documents -> keep this ├── Repos │ ├── pull_all.sh -> keep this ├── subdir1 │ ├── output -> keep this ├── subdir2 ├── another_subdir ├── output -> keep this ├── subdir3 -> do not keep (because does not contain any "output") ├── file3 -> do not keep
稍微重申一下我解釋為您的要求,
- 包括所有
pull_all.sh
文件,無論我們在哪裡找到它們- 包括所有
output
目錄及其內容,無論我們在哪裡找到它們- 排除
Repos
目錄,除了我們已經說過的- 包括其他所有內容
這可以指定如下
rsync --dry-run --prune-empty-dirs -av --include 'pull_all.sh' --include 'Repos/**/output/***' --include '*/' --exclude 'Repos/***' /home backup/
一些筆記
是必需的
--include '*/'
,以便rsync
考慮向下進入Repos
目錄樹(查找pull_all.sh
文件),否則最終--exclude
語句將排除這些目錄樹。的三種不同用途
*
是不同的:
*
匹配除/
字元以外的任何內容**
匹配任何內容,包括/
字元dir/***
是等效於指定dir/
and的快捷方式dir/**
。該
--prune-empty-dirs
標誌停止rsync
創建空目錄,這在我們需要處理Repos
目錄樹查找pull_all.sh
和output
項目時尤為重要。
--dry-run
當您對結果滿意時刪除。