BASH脚本 - 删除超过X天的文件夹,但部分及所有子文件夹/文件除外

时间:2017-02-20 09:42:34

标签: bash directory except

我实际上正在测试这个脚本

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

删除超过7天的所有文件/文件夹,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,{{ 1}})所以

...

脚本出了什么问题?

使用脚本建议进行编辑:

/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

3 个答案:

答案 0 :(得分:2)

我建议不要依赖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)

答案 1 :(得分:2)

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 的目标,并且由于它们被递归删除。

答案 2 :(得分:1)

逃脱!如

 \! -path

确保它不会被解释为模式