如何在OSX中利用mdls配合rsync排除指定标签文件进行备份?
用rsync结合mdls/mdfind排除OSX红/橙标签的文件/文件夹
核心思路
OSX的标签元数据可通过mdls或mdfind工具读取,先搜索出所有带目标标签的文件/文件夹路径,再将这些路径传给rsync的--exclude-from参数实现排除。
步骤1:确认标签的准确名称
OSX默认标签名称为英文(如"Red"、"Orange"),若自定义过标签名,先通过mdls查看目标文件的标签值:
mdls -name kMDItemUserTags /path/to/your/tagged-file
输出示例:kMDItemUserTags = ( "Red" ),其中的"Red"就是搜索时需用的字符串。
步骤2:生成排除列表并执行rsync
方法1:生成临时排除文件(适合需复用排除列表的场景)
# 定义源目录和备份目录 SOURCE="$HOME/Documents" DEST="/Volumes/Backup/Documents" # 搜索源目录内带红/橙标签的文件/文件夹,生成相对路径的排除列表 mdfind -onlyin "$SOURCE" 'kMDItemUserTags == "Red" || kMDItemUserTags == "Orange"' | sed "s|^$SOURCE/||" > exclude-list.txt # 执行rsync备份,排除列表内的路径 rsync -av --exclude-from='exclude-list.txt' "$SOURCE/" "$DEST/" # 可选:删除临时排除文件 rm exclude-list.txt
方法2:进程替换(无需临时文件,更简洁)
SOURCE="$HOME/Documents" DEST="/Volumes/Backup/Documents" rsync -av --exclude-from=<( mdfind -onlyin "$SOURCE" 'kMDItemUserTags == "Red" || kMDItemUserTags == "Orange"' | sed "s|^$SOURCE/||" ) "$SOURCE/" "$DEST/"
关键说明
-onlyin "$SOURCE":限制搜索范围仅在源目录内,避免误排除其他位置的带标签文件。sed "s|^$SOURCE/||":将绝对路径转换为相对于源目录的路径,确保rsync能正确匹配排除项。- 若需排除带标签文件夹下的所有内容,只需将文件夹路径加入排除列表,rsync会自动处理其下所有子项。
内容的提问来源于stack exchange,提问作者Dirk
相关产品推荐
相关产品推荐

