我正在尝试使用该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 有-delete
and -empty
(例如 GNU find),你不需要调用rm
and 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