2010-03-23 80 views
0

我有一个部署目录。一个部署(这本身就是一个目录)命名格式为: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 

任何帮助,将不胜感激。

回答

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循环,以便引用单个行,或者将其捕获到数组中,以便可以使用引述扩张。
+0

伟大的工作,谢谢。 – Ben 2010-03-23 23:33:00

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 

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

0

你可以尝试找到

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