基于integer.name删除文件

时间:2013-07-24 23:16:58

标签: bash

好的,我想要做的是非常具体的。我需要一些代码来删除基于integer.name的目录中的文件。

目录中的文件列出如下

441.TERM (the # is actually a PID so it'll be random)
442.TERM

无论我总是希望保留第一个.TERM文件&之后删除任何.TERM文件,因为我的脚本不应该创建多个文件,但是由于我编写脚本的系统存在一些问题,有时会发生这种情况。我只希望它影响我的000.TERM文件,它在目录中找到的任何其他文件都可以保留。因此,如果目录包含任何.TERM文件,其整数高于找到的第一个整数,则删除整数较高的.TERM文件。

PS。 .TERM不是扩展,以防万一有任何混淆。

1 个答案:

答案 0 :(得分:2)

find /your/path -name "*.TERM" | sort -t. -k1 -n | tail -n +2 | xargs -r rm

让我们分解一下:

  • find /your/path -name "*.TERM"将输出所有.TERM个文件的列表。

    您也可以使用ls /your/path/*.TERM,但您可能会发现输出无法预测。 (示例:您的实现默认情况下可能启用-F,这会导致每个套接字以列表中的=结尾。)

  • sort使用句点作为分隔符(-k1)按第一个字段(-t.)对它们进行排序。 -n保证数字排序(在06之前出现5)。

  • tail -n +2跳过第一行并返回其余

  • xargs rm将每个输出行发送到rm命令,将其删除。 -r如果没有输出管道输出,则会跳过rm,但会被列为GNU扩展名。

上面的脚本非常强大,可以满足您的需求,但如果目录中有太多文件不适合一个命令行,则可能会失败,如果任何匹配的文件名以某种方式包含一个文件名,可能会让您遇到麻烦换行符。