我正在使用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'个文件?
答案 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
,一旦确认它为您产生预期结果)