bash rm删除旧文件只删除第一个文件

时间:2017-05-11 19:42:14

标签: linux bash

我正在使用Ubuntu 16.04.1 LTS

我找到了一个script来删除目录中除“n”个最新文件之外的所有内容。

我将其修改为:

sudo rm /home/backup/`ls -t /home/backup/ | awk 'NR>5'`

它只删除一个文件。它报告以下有关应删除的其余文件的消息:

rm: cannot remove 'delete_me_02.tar': No such file or directory
rm: cannot remove 'delete_me_03.tar': No such file or directory
...

我相信问题就在于道路。它正在当前目录中查找delete_me_02.tar(以及后续文件),并且它以某种方式丢失了对正确目录的引用。

如何修改我的命令以继续在/ home / backup /目录中查找所有'n'个文件?

3 个答案:

答案 0 :(得分:1)

也许find可以帮助你做你想做的事:

find /home/backup -type f | xargs ls -t | head -n 5 | xargs rm

但我会首先查看会返回的内容(只需删除| xargs rm)并检查要删除的内容。

答案 1 :(得分:1)

命令替换扩展后,命令行看起来像

sudo rm /home/backup/delete_me_01.tar delete_me_02.tar delete_me_03.tar etc

/home/backup不会在输出中为每个单词添加前缀。 (旁白:不要在脚本中使用ls;请参阅http://mywiki.wooledge.org/ParsingLs。)

坦率地说,这是大多数贝壳不容易做到的事情。 (例外:使用zsh,您只需使用sudo rm /home/backup/*(Om[1,-6])。)我会使用其他语言。

答案 2 :(得分:1)

反引号中的命令将扩展为相对文件路径列表:

%`ls -t /home/backup/ | awk 'NR>5'`
a.txt b.txt c.txt ...

所以完整命令现在看起来像这样:

sudo rm /home/backup/a.txt b.txt c.txt
我相信,

这使得为什么只删除第一个文件非常明显。

您可以传递给rm的参数数量也有限制,所以 您最好修改脚本以使用xargs代替:

ls -t|tail -n+5|xargs -I{} echo rm /home/backup/'{}'

(只需删除echo,一旦确认它为您产生预期结果)