linux - 删除在脚本中不起作用

标签 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

最佳答案

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

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

编辑:要更正我的答案,可以使用 [[ $filea -nt $fileb ]] 测试通过在 bash 中实现快速排序的内置函数来完成。

例如

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}"

关于linux - 删除在脚本中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48298276/

相关文章:

linux - 禁用 docker 中现有容器的日志

linux - Linux内核中内核地址空间的布局是怎样的?

bash - 在脚本之间发送信号(bash)

python - 脚本交互模式

linux - 我可以在 Eclipse 运行配置中运行脚本吗?

git - 为什么这个 Bash 函数在 git 别名中执行两次,为什么添加 `exit` 可以修复它?

windows - 如何在 Windows 中更改 Git 终端的标题?

linux - 是否可以将 "push"消息发送到事件的 bash 终端?

linux - 将文件从 Suse 服务器移动到 ftp 的 FTP 脚本

windows - 查找域名的IP