如果超过5,则使用Bash脚本删除目录中的文件

时间:2015-04-01 20:53:32

标签: linux bash shell

这是一个将文件从一个目录复制到另一个目录的备份脚本。我使用for循环来检查是否有超过五个文件。如果有,循环应首先删除最旧的条目。

我从命令行尝试ls -tr | head -n -5 | xargs rm,如果目录中有超过5个文件,它会成功删除旧文件。

但是,当我将其放入for循环时,我收到错误rm: missing operand

这是完整的脚本。我不认为我在脚本中正确使用for循环,但我真的不确定如何在循环中使用命令ls -tr | head -n -5 | xargs rm来迭代文件目录。

timestamp=$(date +"%m-%d-%Y")
dest=${HOME}/mybackups
src=${HOME}/safe
fname='bu_'
ffname=${HOME}/mybackups/${fname}${timestamp}.tar.gz

# for loop for deletion of file
for f in ${HOME}/mybackups/*
do
  ls -tr | head -n -5 | xargs rm
done

if [ -e $ffname ];
  then
      echo "The backup for ${timestamp} has failed." | tee ${HOME}/mybackups/Error_${timestamp}
  else
      tar -vczf ${dest}/${fname}${timestamp}.tar.gz ${src}
fi

编辑:我取出了for循环,现在只是:

[...]
ffname=${HOME}/mybackups/${fname}${timestamp}.tar.gz

ls -tr | head -n -5 | xargs rm

if [ -e $ffname ];
[...]

如果脚本位于mybackups目录中,它将起作用,但是,如果它不在该目录中,我将继续得到相同的错误。该脚本获取文件名但尝试将其从当前目录中删除,我认为......我尝试了几次修改但到目前为止没有任何工作。

2 个答案:

答案 0 :(得分:2)

  

我收到错误rm: missing operand

该错误的原因是没有文件可以删除。要避免该错误,请使用--no-run-if-empty选项:

ls -tr | head -n -5 | xargs --no-run-if-empty rm

在评论中,mklement0指出这个问题是GNU xargs所特有的。 BSD xargs不会以空参数运行。因此,它不需要也不支持--no-run-if-empty选项。

更多

引用问题中的一段代码:

for f in ${HOME}/mybackups/*
do
  ls -tr | head -n -5 | xargs rm
done

请注意,(1)f从不用于任何事情,(2)当需要仅运行一次时,它会连续多次运行ls -tr | head -n -5 | xargs rm

强制警告

您的方法解析ls的输出。这使得命令变得简单易懂。它可以工作如果所有文件都明智地命名。 一般情况下无效。有关详情,请参阅:Why you shouldn't parse the output of ls(1)

更安全的替代方案

以下内容适用于所有文件名,无论它们是否包含空格,制表符,换行符或其他内容:

find . -maxdepth 1 -type f -printf '%T@ %i\n' | sort -n | head -n -5 | while read tstamp inode
do
    find . -inum "$inode" -delete
done

答案 1 :(得分:0)

SMH。在我运行cd之前,我最终只是ls -tr | head -n -5 | xargs rm进入了目录中的最简单的解决方案。感谢大家的帮助!

timestamp=$(date +"%m-%d-%Y")
dest=${HOME}/mybackups
src=${HOME}/safe
fname='bu_'
ffname=${HOME}/mybackups/${fname}${timestamp}.tar.gz

cd ${HOME}/mybackups
ls -tr | head -n -5 | xargs rm

if [ -e $ffname ];
  then
      echo "The backup for ${timestamp} has failed." | tee ${HOME}/mybackups/Error_${timestamp}
  else
      tar -vczf ${dest}/${fname}${timestamp}.tar.gz ${src}
fi

此行ls -tr | head -n -5 | xargs rm来自here

  

ls -tr显示所有文件,最早的文件(-t最新的第一个,-r   反向)。

     

head -n -5显示除最后5行之外的所有行(即5个最新文件)。

     

xargs rm为每个选定的文件调用rm