BASH 脚本 - 删除早于 X 天的文件夹,除了一些和所有 subfolders/files

BASH Script - Delete folders older than X days except for some and all their subfolders/files

我正在测试这个脚本

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

删除超过 7 天的所有 files/folders,NODELETE1NODELETE2NODELETE3 文件夹除外。

问题是它显然不起作用,因为它会删除这些文件夹和其中的所有文件。

这就是我想要做的:

我有

/Path/Folder/NODELETE1/some files and folders
/Path/Folder/NODELETE2/some files and folders
/Path/Folder/NODELETE3/some files and folders
/Path/Folder/AFOLDER/somefiles and folders
/Path/Folder/ANOTHERFOLDER/somefiles and folders
/Path/Folder/...
/Path/Folder/FILE
/Path/Folder/ANOTHERFILE
/Path/Folder/...

我想自动删除所有超过 7 天的文件和文件夹(所以 FOLDERANOTHERFOLDER...FILEANOTHERFILE...) 这样

/Path/Folder/NODELETE1/some files and folders
/Path/Folder/NODELETE2/some files and folders
/Path/Folder/NODELETE3/some files and folders

脚本有什么问题?

使用脚本建议进行编辑:

#!/bin/bash

while IFS= read -r -d '' dir
do

    # This line actually halts the control from entering if 
    # dirname contains either of the three names below. You could
    # remove it and put your actual folder names.

    [[ $dir =~ ^(NODELETE1|NODELETE2|NODELETE3)$ ]] && continue

    # Suggest un-commenting the echo line below and comment rm to ensure
    # you have only the folders you want to delete. 
    echo "$dir"

    # rm -rf "$dir"     
done< <(find /Users/Username/Desktop/test/* -type d -mtime +7 -print0)

为了测试,我有:

/Users/Username/Desktop/test/NODELETE1
/Users/Username/Desktop/test/NODELETE2
/Users/Username/Desktop/test/NODELETE3
/Users/Username/Desktop/test/YESDELETE

和脚本路径

/Users/Username/Desktop/TEST.sh

逃脱!作为

 \! -path

确保它不会被解释为模式

与其依赖 find 命令的核心实用程序,我建议让 bash 处理它(无论如何你已经标记了 bash)以排除具有具体名称,

#!/bin/bash

while IFS= read -r -d '' dir
do

    # This line actually halts the control from entering if 
    # dirname contains either of the three names below. You could
    # remove it and put your actual folder names.

    [[ $dir =~ ^(NODELETE1|NODELETE2|NODELETE3)$ ]] && continue

    # Suggest un-commenting the echo line below and comment rm to ensure
    # you have only the folders you want to delete. 
    # echo "$dir"

    rm -rf "$dir"     
done< <(find /Path/Folder/* -type d -mtime +7 -print0)

TL;DR 修复:

代替你的行,做:

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

更长的解释:

您行中的 -type d 部分仅搜索目录。但是您要排除的是 NODELETE 目录中的内容。这仍然意味着您的 NODELETE 目录是 rm -rf 的目标,因此它们被递归删除。