Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux Bash脚本,用于删除目录中超过5个的文件_Linux_Bash_Shell - Fatal编程技术网

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
。BSD
xargs
将不会使用空参数运行。因此,它不需要也不支持
--空时不运行
选项

更多 引用问题中的一段代码:

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非常感谢。我澄清了“考虑”部分,并在BSD
xargs
上添加了您的信息。这可能看起来很奇怪(对我来说),但是,当与OP的代码中的
head-n-5
一起使用时,
sort-n
在这里实际上是正确的。(我通过测试验证了这一点。)或者,我们可以使用
sort-rn | tail-n+6
达到同样的效果。为什么需要for循环?@John1024指出我不需要循环,我将其取出,但我不想编辑原始问题中的代码。请参阅下面的评论。