这是一个将文件从一个目录复制到另一个目录的备份脚本。我使用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
目录中,它将起作用,但是,如果它不在该目录中,我将继续得到相同的错误。该脚本获取文件名但尝试将其从当前目录中删除,我认为......我尝试了几次修改但到目前为止没有任何工作。
答案 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