我正在尝试删除名为Date_Sources
的目录中的文件。该目录中有5个子文件夹,名为Test1
Test2
... Test5
。
我知道如何每90天删除一次文件:
find /home/deployer/Data_Sources/.../.. -mtime +90 -type f -exec rm -r '{}' \;
如何确保我的脚本在90天后删除所有文件除了最新文件(每个子目录)?
因此脚本必须转到Date_Sources/Test1
,Data_sources/Test2
,...等,并确保除了最新的文件以外90天后删除所有文件。
答案 0 :(得分:3)
类似的东西:
find /home/deployer/Data_Sources -maxdepth 1 -mindepth 1 -type d > afile
while IFS= read -r subdir
do
find "$subdir" -mtime +90 -type f -printf "%T+\t%p\n" \
| sort \
| head -n-1 \
| sed 's|[[:blank:]]\+| |' \
| cut -f 2 -d " " > bfile
while IFS= read -r each
do
rm -vf "$each"
done < bfile
done < afile
rm -f bfile afile
说明:
查找直接目录(/home/deployer/Data_Sources
)中-maxdepth 1
内的所有目录并排除其自身(-mindepth 1
),并将其转储到名为afile
find /home/deployer/Data_Sources -maxdepth 1 -mindepth 1 -type d > afile
从afile
读取每一行并存储在环境变量subdir
中(请参阅此循环的done
行,以查看afile
是否通过管道传输到{{1} }} loop)
while
在每个while IFS= read -r subdir
do
上运行find
命令,仅列出超过90天的文件(并打印文件的时间戳)
subdir
find "$subdir" -mtime +90 -type f -printf "%T+\t%p\n" \
sort
find
抓取除 | sort \
输出的最后一行之外的所有行(最后一行是最新文件)
sort
将所有多个空格替换为单个空格
| head -n-1 \
从输出中获取第二列,将空格定义为分隔符;全部转储到名为 | sed 's|[[:blank:]]\+| |' \
的文件中。 (可能以某种方式使用选项卡作为分隔符而不使用上面的bfile
,但我不确定如何指定它以便它可以工作; sed
肯定没有做到这一点)< / p>
-d "\t"
现在,逐行阅读 | cut -f 2 -d " " > bfile
并存储在bfile
环境变量中(再次:查看完成行以显示管道中的each
)
bfile
实际上是删除旧文件(冗长和抑制提示)
while IFS= read -r each
do
删除临时文件 rm -vf "$each"
done < bfile
done < afile
和bfile
afile
注意:
- 更新以删除使用rm -f bfile afile
循环以正确处理路径中的特殊字符和空格;还有变量的双引号(由@ mklement0建议)