如何递归删除除文件列表之外的所有文件?

tar*_*yte 4 bash find shell-script rm

如何递归删除目录中的所有内容,除了要保留的一小部分文件?例如,让我们尝试删除除名为f2和 的文件之外的所有文件f5

# Create a testing ground
mkdir -p d{1..3}
touch d{1..3}/f{1..5}

# Remove all files EXCEPT ones named f2 and f5.
find . -type f -not -name ('f2'|'f5') -type f -exec rm -f '{}' +

# Remove empty directories
find . -type d -empty -delete
Run Code Online (Sandbox Code Playgroud)

产生:

bash: syntax error near unexpected token `('
Run Code Online (Sandbox Code Playgroud)

最终目标是在更大的 C 用户空间应用程序中执行此操作,但system()用于执行命令行命令似乎要容易得多。

PSk*_*cik 7

find . -type f -not \( -name f2 -o -name f5 \) -delete
Run Code Online (Sandbox Code Playgroud)

应该这样做。

-delete就像-exec rm -f '{}' +但更短,甚至更有效率。不过,先在没有它的情况下运行它,以确认它只获取您真正想要删除的文件。

  • 如果我们在这里谈论 C,那么 `\(` 需要是 `\\(` 或 `'('`。对于右括号也是如此。 (2认同)