Linux Bash脚本,用于删除目录中超过5个的文件
这是一个备份脚本,用于将文件从一个目录复制到另一个目录。我使用Linux Bash脚本,用于删除目录中超过5个的文件,linux,bash,shell,Linux,Bash,Shell,这是一个备份脚本,用于将文件从一个目录复制到另一个目录。我使用for循环检查是否有五个以上的文件。如果有,循环应该首先删除最旧的条目 我从命令行尝试了ls-tr | head-n-5 | xargs rm,如果目录中有5个以上的旧文件,它可以成功地删除旧文件 timestamp=$(date +"%m-%d-%Y") dest=${HOME}/mybackups src=${HOME}/safe fname='bu_' ffname=${HOME}/mybackups/${fname}${tim
for
循环检查是否有五个以上的文件。如果有,循环应该首先删除最旧的条目
我从命令行尝试了ls-tr | head-n-5 | xargs rm
,如果目录中有5个以上的旧文件,它可以成功地删除旧文件
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
循环时,我得到一个错误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
目录中,它将工作,但是,如果它不在该目录中,我将继续得到相同的错误。脚本获取文件名,但试图将其从当前目录中删除,我认为。。。我尝试了几次修改,但到目前为止没有任何效果
我收到一个错误rm:缺少操作数
该错误的原因是没有要删除的文件。为避免该错误,请使用--no run if empty
选项:
ls -tr | head -n -5 | xargs --no-run-if-empty rm
在评论中,mklement0注意到这个问题是GNU特有的xargs
。BSDxargs
将不会使用空参数运行。因此,它不需要也不支持--空时不运行
选项
更多
引用问题中的一段代码:
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
的输出。这使得命令简单易懂。如果您的所有文件都有合理的名称,它就可以工作。一般来说,这是行不通的。有关此方面的详细信息,请参阅:
更安全的选择
以下内容适用于所有类型的文件名,无论它们是否包含空格、制表符、换行符或其他内容:
find . -maxdepth 1 -type f -printf '%T@ %i\n' | sort -n | head -n -5 | while read tstamp inode
do
find . -inum "$inode" -delete
done
SMH。在运行ls-tr | head-n-5 | xargs rm
之前,我只需cd
-ing进入目录,就得到了世界上最简单的解决方案。谢谢大家的帮助
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
来自
ls-tr显示所有文件,最旧的优先(-t最新的优先,-r
反向)
head-n-5显示除最后5行以外的所有行(即5个最新文件)
xargs rm为每个选定文件调用rm
好的,我明白你的意思了。因此,我删除了for循环并在脚本中运行了该命令,但现在它找到了正确的文件,但说它无法删除它们无法删除'6.txt':没有这样的文件或目录
我认为rm在正确的目录下工作。@Cyrus${HOME}/mybackups/
@MichaelJames名为6.txt的目录中是否有实际文件?如果目录中的文件名中有空格,则会出现如下错误(这就是为什么解析ls被认为是错误的)。@mklement0非常感谢。我澄清了“考虑”部分,并在BSDxargs
上添加了您的信息。这可能看起来很奇怪(对我来说),但是,当与OP的代码中的head-n-5
一起使用时,sort-n
在这里实际上是正确的。(我通过测试验证了这一点。)或者,我们可以使用sort-rn | tail-n+6
达到同样的效果。为什么需要for循环?@John1024指出我不需要循环,我将其取出,但我不想编辑原始问题中的代码。请参阅下面的评论。