2017-05-11 107 views
1

我使用Ubuntu 16.04.1 LTS的bash rm删除旧文件仅删除第一个

我发现了一个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(以及后续文件),并且它以某种方式失去了对正确目录的引用。

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

回答

1

也许找到可以帮助你做你想要什么:

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

但我会先检查什么发现将返回(只是删除| xargs rm),并检查是怎么回事被删除。

+0

找到是正确的答案。 find/home/backup /。 -type f | xargs ls -t | tail -n + 5 | xargs rm -f' – ekcell

+0

我相信这是有效的,因为'find'返回完整路径,我认为这是一个有点显着的区别。 – ekcell

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。)

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

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,一旦你验证,它产生一个预期的结果为你)