查找:删除文件夹和子文件夹,但对两个文件添加例外

查找:删除文件夹和子文件夹,但对两个文件添加例外

我正在尝试使用该find命令执行以下操作:
删除包含文件、文件夹和子文件夹的整个文件夹(2 个文件除外),这是我需要的示例:

 test/folder1/file1.txt
 test/folder1/file2.txt
 test/folder1/subfolder1/
 test/folder1/subfolder1/file3.txt
 test/folder1/subfolder1/subfolder2/file4.txt
 test/folder2/file5.txt
 test/folder3/file6.txt

我需要删除除 和 之外的所有file2.txt内容file3.txt

这是我已经做过的

 find /test* ! -path '/test/folder1/file2.txt' -a ! -path 'test/folder1/subfolder1/file3.txt'

这将列出除我指定的文件之外的所有文件。但是,如果我-exec rm -rf {}在命令末尾添加,它将删除所有内容。

我也尝试过其他命令但没有成功

rm -r  test/folder1/ !(file2.txt|file3.txt)

我对正则表达式不太了解,所以我试图通过测试我在网上找到的命令来使其工作,但它们似乎都不起作用。

答案1

别打电话rm -rf。一旦您在目录上运行它,就会删除该目录和子目录中的所有文件,甚至是您想要保留的文件。更一般地说,rm -rf除非您知道为什么简单的方法rm行不通,否则不要打电话。rm -f如果您想确保您的脚本不会要求确认删除只读文件,则此处是有保证的,但-r显然没有保证。

仅删除文件:

find /test* ! -path '/test/folder1/file2.txt' -a ! -path 'test/folder1/subfolder1/file3.txt' -a -exec rm -f {} +

如果您还想删除变空的目录,请调用rmdir它们。使用-depth以便在目录本身之前考虑目录内容。

find /test* ! -path '/test/folder1/file2.txt' -a ! -path 'test/folder1/subfolder1/file3.txt' -a \( -type d rmdir {} \; -o -exec rm -f {} \; \)

rmdir在非空目录上运行时您会收到错误,它们很烦人但无害。

如果你的 find 有-deleteand -empty(例如 GNU find),你不需要调用rmand rmdir

find /test* ! -path '/test/folder1/file2.txt' -a ! -path 'test/folder1/subfolder1/file3.txt' -a ! -type d ! -empty -delete

答案2

看,我也不知道如何使用find选项来做到这一点,但你也可以使用 shell 脚本find

首先删除文件:

 find . -type f -exec bash -c \
    ' [[ "{}" == "./test/folder1/file2.txt" || \
         "{}" == "./test/folder1/subfolder1/file3.txt" ]] \
      || rm "{}" ' \;

然后删除所有非空文件夹:

find .  -type d -exec rmdir {} \; 2>/dev/null

相关内容