Linux 按字母顺序排序时删除除N个文件以外的所有文件的Bash脚本
在标题中很难解释Linux 按字母顺序排序时删除除N个文件以外的所有文件的Bash脚本,linux,bash,ubuntu,Linux,Bash,Ubuntu,在标题中很难解释 我有一个bash脚本,每天运行,将一个文件夹备份到一个zip文件中。zip文件名为worldYYYYMMDD.zip,其中YYYYMMDD为备份日期。我要做的是删除除5个最新备份之外的所有备份。将文件按字母顺序排序将首先列出最旧的文件,因此,在按字母顺序排序时,我基本上需要删除除最后5个文件以外的所有文件。下面一行应该可以做到这一点 ls -F world*.zip | head -n -5 | xargs -r rm ls-F:按字母顺序列出文件 head-n-5:过滤掉
我有一个bash脚本,每天运行,将一个文件夹备份到一个zip文件中。zip文件名为world
YYYYMMDD
.zip,其中YYYYMMDD
为备份日期。我要做的是删除除5个最新备份之外的所有备份。将文件按字母顺序排序将首先列出最旧的文件,因此,在按字母顺序排序时,我基本上需要删除除最后5个文件以外的所有文件。下面一行应该可以做到这一点
ls -F world*.zip | head -n -5 | xargs -r rm
:按字母顺序列出文件ls-F
:过滤掉除最后5行之外的所有行head-n-5
:删除每个给定文件xargs-rrm
:如果输入为空,则不要运行-r
rm
- 这个怎么样:
find /your/directory -name 'world*.zip' -mtime +5 | xargs rm
之前先测试一下。这将删除所有超过5天的world*.zip
文件。所以这是一个不同于你的逻辑
ls | grep ".*[\.]zip" | sort | tail -n-5 | while read file; do rm $file; done
对文件进行排序排序
返回除5个最近的tail-n-5
循环执行删除操作while
- 我现在无法测试它,因为我没有Linux机器,但我认为它应该是:
rm `ls -A | head -5`
ls world*.zip | sort-r | tail n+5 | xargs rm
sort-r
将按相反顺序排序,因此最新的将位于顶部
tail n+5
将输出行,从第5行开始
xargs rm
将删除这些文件。Xargs用于将stdin作为参数传递给rm。er…includels-AF world*.zip
更好。ls-F
在文件名末尾添加了cruft,因此不应使用<代码>-不需要,因为所有文件都没有隐藏。@larsmans,谢谢,已更新。(我只是假设他想要它,正如他在op中所做的那样。)肯定需要删除-F
。请将最后一位xargs-r rm
,否则当文件数少于5个时,它将出错。这将删除5个文件。作者只需要5个和grep-c计数的文件。@Benoit是一个打字错误,我已经纠正了。可能是echo world*.zip | sort | tail-n-5 | xargs rm更有效。grep没有必要@Benoit:echo
在一行上输出所有内容,因此排序无效。这是否意味着在您感觉备份过多时手动执行,或者每次运行bash脚本时?@chaz8705我都会使用这两种方法。我知道这些答案中的大多数都会因包含空格的文件名而失败。尽管这很有意义,但我不想根据文件日期进行删除。如果备份脚本失败,我仍然希望保留最新的5个,因此aioobe的答案对我来说是最好的。{}应该是转义的或引号中的。我知道它在这种情况下是有效的,但它仍然是一个很好的实践,并且是手册页推荐的。