【问题标题】:Delete every week all files except some folders (but not the files into these)每周删除除某些文件夹外的所有文件(但不是这些文件夹中的文件)
【发布时间】:2017-09-22 13:49:28
【问题描述】:

我每周都使用这个 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

【问题讨论】:

    标签: bash cron sh except


    【解决方案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
    

    另外,您可以使用-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*"
    

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

    【讨论】:

    • 哇!完美的解释!如果我想维护其他名称不同的文件夹,例如 DOCUMENTS、WORK 和 DELEGATE(总共 6 个文件夹),该怎么办。
    • 最后一个问题:如果我想将您的脚本用于一个文件夹(例如 DOCUMENTS,但这是一个示例),我想改为维护文件(旧脚本和您的组合)如何我可以吗?
    • 谢谢。你可以看看编辑吗?终端给我一个错误(查找:警告:您在非选项参数 -and 之后指定了 -regextype 选项,但选项不是位置的(-regextype 影响在它之前指定的测试以及在它之后指定的测试)。请指定其他参数之前的选项。- 发现:无效表达式;您使用了二元运算符“-and”,之前没有任何内容。)
    • 只需删除第一个-and,它是经典逻辑(A ^ B) 中的用法,其中A 和B 都必须为真,因此公式为真。另一个公式(^ A ^ B) 不是该语言中的有效表达式,因为第一个^ 不绑定两个命题。此处模仿了该行为:find /path/Folder/* -and 相当于以 (^ A) 开头的句子,因此只需将其删除即可。这应该会给你留下:find /path/Folder/* -not -path "/path/Folder/DELEGATE*" -mtime +7 ! -regextype posix-egrep ! -regex ".*/path/Folder/(DOCUMENTS|WORK|PENDING)$" -delete
    • 它现在说的是同样的事情,但关于“not”(查找:警告:您在非选项参数 -not 之后指定了 -regextype 选项,但选项不是位置的(-regextype 影响测试在它之前指定的以及在它之后指定的)。请在其他参数之前指定选项。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-13
    • 1970-01-01
    • 1970-01-01
    • 2015-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多