我实际上正在测试这个脚本
find /Path/Folder/* -type d -mtime +7 ! -path "/Path/Folder/NODELETE1/*" ! -path "/Path/Folder/NODELETE2/*" ! -path "/Path/Folder/NODELETE3/*" -exec rm -rf {} \;
删除超过7天的所有文件/文件夹,NODELETE1
,NODELETE2
和NODELETE3
文件夹除外。
问题在于它显然无法正常工作,因为它会删除这些文件夹及其中的所有文件。
这就是我想要做的事情:
我有
/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天之前的所有文件和文件夹(FOLDER
,ANOTHERFOLDER
,...
,FILE
,ANOTHERFILE
,{{ 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
答案 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
确保它不会被解释为模式