查找命令:删除除一个文件夹外的所有内容

我有以下命令:

find ~/Desktop/testrm -mindepth 1 -path ~/Desktop/testrm/.snapshot -o -mtime +2 -prune -exec rm -rf {} +

我希望它按原样工作,但必须避免删除特定目录($ ROOT_DIR / $ DATA_DIR)。

  • 它必须删除目录中的文件,但不能删除目录本身
  • 需要rm中的标志“ r”,因为它必须删除其他目录
  • -prune不适合,因为它将丢弃内容以及子目录
yshvip 回答:查找命令:删除除一个文件夹外的所有内容

您可以使用-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 ...等)。

本文链接:https://www.f2er.com/2313092.html

大家都在问