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

时间:2017-04-25 13:46:43

标签: bash cron sh except

我正在使用这个bash脚本每周删除位于目录中的所有文件和文件夹,除了三个文件夹和包含在这些文件夹中的文件。 但是,我现在如何修改脚本以便只保留这三个折叠但不包含文件? 这三个文件夹对于工作流程是必需的,但不是包含的文件(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

1 个答案:

答案 0 :(得分:1)

好吧,首先,如果您要删除文件,则不再需要-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

同样,您可以使用-exec rm -rf {}代替-delete

$ 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! (我之所以避免这样做是因为没有必要证明这个案例)

如果您想保留其他文件夹,可以使用OR regex find path/folder/* -regextype posix-egrep ! -regex ".*path/folder/(NODELETE[1-3]|DOCUMENTS|WORK|DELEGATE)$" -delete ,但{@ 1}}不会删除文件夹,但会删除其中的文件:

find

如果你想保留某个文件夹的文件,你可以为find [...] -and -not -path "path/folder/DOCUMENTS*" 指定另一个过滤器:

*

请注意,最后的db.documents.findOne({"external-id": x}, {"_id":0, "external-id": 1}); 不仅会匹配文件夹本身,还会匹配其中的所有文件。