2017-02-20 120 views
2

实际上我测试这个脚本bash脚本 - 删除文件夹超过X天的除了一些和所有及其子文件夹/文件

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

删除所有文件/文件超过7天以上,除了NODELETE1文件夹,NODELETE2NODELETE3文件夹。

问题是,它显然不工作,因为它删除了这些文件夹和里面的所有文件。

这就是我想做的事:

/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 
+0

你可以试试'-not -path“/ Path/Folder/NODELETE1/*”'而不是'! -path“/ Path/Folder/NODELETE1/*”' – Inian

+1

只有我患有偏执狂,绝不会直接执行'rm -rf'作为'find -exec'的参数吗? :) – jm666

+0

@ jm666:同样在这里,多数民众赞成为什么建议一个备用的专有名称检查 – Inian

回答

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 {} \; 

更详细的解释:

你行的型d部分搜索只目录。但是你排除的是你的NODELETE目录中的东西。这仍然意味着您的NODELETE目录是rm -rf的目标,并且由于它们被递归删除。

+1

它完美的作品! – DylanDog

1

逃离!作为

\! -path 

,以确保它不会解读为模式

2

不是依靠find命令的核心utils的,我会建议让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) 
+0

它给了我这个错误'线17:语法错误附近意外的令牌'<'''/用户/用户名/桌面/测试。sh:第17行:''done < DylanDog

+0

@DylanDog:你是用bash解释器设置的吗? '#!/ bin/bash'在脚本的顶部? – Inian

+0

yes'#!/ bin/bash' – DylanDog

相关问题