删除不在脚本内部工作

时间:2018-01-17 10:00:40

标签: linux bash shell unix scripting

创建以下脚本以仅保留最新的3个文件,但rm命令不会删除文件。

#!/bin/sh
count=$(ls -1 /var/mds_backup/archives | wc -l)
echo "$count"
if [ "$count" -gt "3" ]; then
    difference=`expr $count - 3`
    rm -f $(ls -1t  /var/mds_backup/archives | tail -n $difference)
else
    echo "Nothing to Delete !!!"
fi

1 个答案:

答案 0 :(得分:0)

  • ls -1t /var/mds_backup/archives将在没有路径的目录中显示文件名,路径丢失,这就是rm无法删除文件的原因。 解析ls并不安全。但是,按上次访问时间对文件进行排序不能使用bash内置函数,因为要获得上次修改,必须调用外部命令。我会改用perl命令。

快速解决方法是将ls -1t /var/mds_backup/archives替换为ls -1td /var/mds_backup/archives/*-d以避免列出目录(如果存在)。在执行rm命令之前,可以使用echo作为前缀,以避免删除不需要的文件。

编辑:为了纠正我的回答,可以使用内置函数在bash中使用[[ $filea -nt $fileb ]]测试快速排序。

例如

files=( /var/mds_backup/archives/* )

qs() {
  local l=() g=() p=$1
  r=();shift||return
  for i; do [[ $i -nt $p ]] && l+=("$i") || g+=("$i"); done
  qs "${l[@]}"; l=("${r[@]}")
  qs "${g[@]}"; g=("${r[@]}")
  r=("${l[@]}" $p "${g[@]}")
}

qs "${files[@]}"

echo "${r[@]:3}"
rm  "${r[@]:3}"