我有以下命令:
find ~/Desktop/testrm -mindepth 1 -path ~/Desktop/testrm/.snapshot -o -mtime +2 -prune -exec rm -rf {} +
我希望它按原样工作,但必须避免删除特定目录($ ROOT_DIR / $ DATA_DIR)。
答案 0 :(得分:1)
您可以使用-o
的短路行为来排除单个路径(就像您对~/Desktop/testrm/.snapshot
所做的那样)。
但是,对于每个排除的路径,您还必须排除其所有父目录。否则,您可以通过用a/b/c
删除a/b/
或a/
来删除rm -rf
。
在以下脚本中,函数orParents
生成find
命令的一部分。示例:
find $(orParents a/b/c) ...
将运行
find -path a/b/c -o -path a/b -o -path a -o ...
。
#! /usr/bin/env bash
orParents() {
p="$1"
while
printf -- '-path %q -o' "$p"
p=$(dirname "$p")
[ "$p" != . ]
do :; done
}
find ~/Desktop/testrm -mindepth 1 \
$(orParents "$ROOT_DIR/$DATA_DIR") -path ~/Desktop/testrm/.snapshot -o \
-mtime +2 -prune -exec rm -rf {} +
警告::您必须确保$ROOT_DIR/$DATA_DIR
not 以/
结尾并且 not 包含*
,?
和[]
之类的全局字符。
可以使用空格,因为printf %q
可以正确转义它们。但是,find -path
独立地将其参数解释为全局模式。我们可以做一个双重报价机制。也许像printf %q "$(sed 's/[][*?\]/\\&/' <<< "$p")"
之类的东西,但是我不确定find -path
到底如何解释其参数。
或者,您可以编写脚本isParentOf
并执行...
find ... -exec isParentOf "$ROOT_DIR/$DATA_DIR" {} \; -o ...
...排除$ROOT_DIR/$DATA_DIR
及其所有父母。如果您不想将脚本文件添加到路径中,这可能更安全,更可移植,但是设置起来较慢且麻烦(find -exec bash -c ...
等)。