用于删除旧部署的bash脚本

时间:2010-03-23 21:57:01

标签: bash

我有一个我们部署的目录。部署(本身就是目录)以以下格式命名:

<application-name>_<date>

e.g. trader-gui_20091102

有多个应用程序部署到同一个父目录,因此父目录的内容可能如下所示:

trader-gui_20091106
trader-gui_20091102
trader-gui_20091010
simulator_20091106
simulator_20091102
simulator_20090910
simulator_20090820

我想编写一个bash脚本来清除除最新应用程序之外的所有部署。 (最新的当前部署名称中的日期表示)。因此,在上面的父目录上运行bash脚本会留下:

trader-gui_20091106
simulator_20091106

任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分:1)

快速单行:

ls | sed 's/_[0-9]\{8\}$//' | uniq |
while read name; do
    rm $(ls -r ${name}* | tail -n +2)
done

列出文件,砍掉下划线后跟8位数字,只保留唯一的名称。对于每个名称,请删除除最新名称之外的所有内容。

假设:

  • 按字母顺序排序时最新的将是最后一次。如果不是这种情况,请在tail -n +2
  • 之前添加一个在管道中执行所需操作的排序
  • 此目录中没有其他文件。如果有,请限制ls的输出,或通过grep将其输出以仅选择您想要的内容。
  • 文件名中没有奇怪的字符。如果有...而不是直接使用内部ls管道的输出,你可能想要将它管道到另一个while循环中,这样你就可以引用各行,或者在数组中捕获它,这样你就可以使用引用扩张。

答案 1 :(得分:0)

shopt -s exglob
ls|awk -F"_" '{a[$1]=$NF}END{for(i in a)print i"_"a[i]}'|while read -r F
do 
   rm !($F)
done

由于您在filename中的日期已经是“可排序的”,因此awk命令会查找每个应用程序的最新文件。 rm (!$F)只是意味着删除那些不是最新的文件名。

答案 2 :(得分:0)

您可以尝试查找

# Example: Find and delete all directories in /tmp/ older than 7 days:
find /tmp/ -type d -mtime +7 -exec rm -rf {} \; &>/dev/null