Shell中无需正则表达式,如何忽略或排除以~结尾的备份文件?
忽略备份文件计算MD5校验值的通用Shell方法
当然有!Shell里有几种通用的方法可以帮你忽略各类备份文件,适配不同的备份命名场景,我来给你拆解几个实用方案:
方案1:直接用find排除匹配的备份文件
最常用的方式是通过find的! -name参数,直接过滤掉符合备份命名规则的文件。比如常见的备份文件类型包括:以~结尾的编辑器临时备份(如Vim生成的file.txt~)、.bak/.orig后缀的备份文件。
执行命令:
find /path/to/ -type f \( ! -name "*~" ! -name "*.bak" ! -name "*.orig" \) -print0 | xargs -0 md5sum
- 这里的
\( ... \)用来把多个排除条件组合成一个整体,确保逻辑正确; - 你可以根据自己实际的备份文件命名,添加更多
! -name "模式"的条件,比如要排除.tmp后缀的文件,就加! -name "*.tmp"。
方案2:跳过整个备份目录
如果你的备份文件都集中在某个特定目录(比如backup/或者.backup/),可以用find的-prune参数直接跳过整个目录,避免不必要的遍历:
find /path/to/ -type d -name "backup" -prune -o -type f -print0 | xargs -0 md5sum
-prune会告诉find跳过匹配到的目录,不深入其中查找文件;- 如果有多个备份目录,同样可以扩展条件,比如
-type d \( -name "backup" -o -name ".tmp_dir" \) -prune。
方案3:批量读取排除规则(适合多模式场景)
如果你有大量要排除的文件模式,逐个写在命令里太麻烦,可以把规则写到一个文件中,结合grep来过滤:
- 先创建一个排除规则文件
exclude_patterns.txt,每行写一个要排除的模式:
*~ *.bak *.orig *.tmp
- 然后执行命令:
find /path/to/ -type f -print0 | grep -z -v -F -f exclude_patterns.txt | xargs -0 md5sum
-z参数对应find的-print0,用null字符作为分隔符,避免文件名含空格时出问题;-v表示反向匹配(即保留不匹配规则的文件);-F把规则当作固定字符串而非正则表达式,避免转义麻烦;-f指定读取规则的文件。
这些方法都是Shell环境下通用的,不管你用Bash、Zsh还是其他主流Shell都能生效,你可以根据自己的备份文件情况选择最合适的方案~
内容的提问来源于stack exchange,提问作者Avinash Jeeva




