查找工作区并删除具有名称的所有内容,文件名和目录模式中的所有内容除外

Find workspace and delete everything with the name, except for filename and everything in a directory pattern

我正在尝试创建一个 cronjob,它将删除具有模式 *.jar 的所有内容,除了 master.jar 和目录模式 */jarkeeper/*/staging/*[=12= 中的任何内容]

我很接近,但没有找到正确的命令。这是我目前所拥有的:

find /var/lib/jenkins/workspace/ ! -path "*/jarkeeper/*/staging/*" -or -type f ! -name master.jar -name \*.jar

find /var/lib/jenkins/workspace/ \( ! -path "*/jarkeeper/*/staging/*" \) -or \( -type f ! -name master.jar \) -name \*.jar

正确的格式应该是什么?

作为一个想法,我总是觉得组合更原始的工具比使用 find 的复杂语法更舒服,例如:

find $somewhere -name \*.jar | grep -v master.jar | \
    grep -vE "jarkeeper/.*/staging/" | xargs rm -rf

这样做的另一个好处是您可以 test/check/debug 逐个编写脚本。

这个问题看起来您使用的是 -or 而不是 -or。我还建议始终使用 -path 而不是 -name 来保持一切一致,因此:

find /var/lib/jenkins/workspace/ -type f ! -path "*master.jar" -or ! -path "*/jarkeeper/*/staging/*" -or -path "*.jar"