每周删除除某些文件夹外的所有文件(但不删除这些文件夹中的文件)

Delete every week all files except some folders (but not the files into these)

我每周都使用此 bash 脚本删除目录中的所有文件和文件夹,但三个文件夹和其中包含的文件除外。 但是我现在如何修改脚本以便只保留这三个文件夹而不保留包含的文件? 这 3 个文件夹是工作流程所必需的,但不是其中包含的文件(7 天后)。

find /Path/Folder/* -type d -mtime +7 ! -path "/Path/Folder/NODELETE1"  ! -path "/Path/Folder/NODELETE2"  ! -path "/Path/Folder/NODELETE3" -exec rm -rf {} \;

我要的是

之前

Path/NODELETE1/files
Path/NODELETE2/files
Path/NODELETE3/files
Path/FOLDERS
Path/files

之后

Path/NODELETE1
Path/NODELETE2
Path/NODELETE3

编辑:

find /path/Folder/* -and -not -path "/path/Folder/DELEGATE*" -mtime +7 ! -regextype posix-egrep ! -regex ".*/path/Folder/(DOCUMENTS|WORK|PENDING)$" -delete

嗯,首先,如果您想删除文件,您不再需要 -type d。您可以使用 regexfind 来处理这种情况; regex 匹配不以 NODELETE[1-3]:

结尾的所有内容
find path/folder/* -regextype posix-egrep ! -regex ".*path/folder/NODELETE[1-3]$"

这将匹配,例如:

$ find path/folder/* -regextype posix-egrep ! -regex ".*path/folder/NODELETE[1-3]$"
path/folder/asd
path/folder/asd/will_delete
path/folder/bleeegh
path/folder/NODELETE1/eraseme
path/folder/NODELETE2/a_folder
path/folder/NODELETE2/a_folder/delete_me

此外,您可以使用 -delete:

而不是 -exec rm -rf {}
$ find path/folder/* -regextype posix-egrep ! -regex ".*path/folder/NODELETE[1-3]$" -delete
$ tree
.
└── path
    └── folder
        ├── NODELETE1
        ├── NODELETE2
        └── NODELETE3

5 directories, 0 files

所以,文件夹还在,其他文件夹和文件没有了,NODELETE[1-3]里面的文件和文件夹也没有了。

别忘了加上-mtime +7! (我避免了它,因为没有必要证明这个案例)


如果您想保留其他文件夹,您可以在 regex 中使用 OR,这不会删除文件夹,但会删除其中的文件:

find path/folder/* -regextype posix-egrep ! -regex ".*path/folder/(NODELETE[1-3]|DOCUMENTS|WORK|DELEGATE)$" -delete

如果您想保留某个文件夹的文件,您可以为 find 指定另一个过滤器:

find [...] -and -not -path "path/folder/DOCUMENTS*"

请注意,末尾的 * 不仅会匹配文件夹本身,还会匹配其中的所有文件。