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



我正在使用 Ubuntu 16.04.1 LTS

我找到了一个脚本来删除目录中除"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"文件?

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

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

但是我会首先检查查找将返回的内容(只需删除| xargs rm(,然后检查将要删除的内容。

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

%`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,一旦您验证它为您产生了预期的结果(

命令替换展开后,命令行如下所示

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])。我会使用其他语言。

最新更新