Bash shell:如何解析文件名

时间:2015-10-10 19:51:52

标签: linux bash shell unix

所以我有几种格式的文件:

var express = require('express'),
    myroutes = express.Router();

myroutes.get('/foo', (req, res) => {
  res.status(200).type('application/json').send({ myparam: 'foo' });
});

module.exports = exports = myroutes;

唯一的共同点是

var app = require('express')(),
    myroutes = require('./myroutes');

app.use('/api', require('./myroutes'));
app.listen(process.env.PORT || 3000);

在扩展之前,如果文件有一个。

我的问题是我必须将该日期与一堆具有相同名称但日期不同的文件进行比较,然后删除除4个最新文件以外的所有文件。

例如为: 有这个

fileYYYY-MM-DD-HH.foo
nameOfFileYYYY-MM-DD-HH.bar
FileNameYYYY-MM-DD-HH
NameYYYY-MM-DD-HH

得到这个:

YYYY-MM-DD-HH
YYYY - Year
MM   - Month (2 digit)
DD   - Day   (2 digit)
HH   - Hour  (2 digit)

我真的不知道如何做到这一点。

2 个答案:

答案 0 :(得分:1)

如果您的awk具有patsplit功能,那么您很幸运:

sort -r |
awk '{patsplit($0,a,"[1-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]-[0-9][0-9]",s)}
     s[0]!=p0 || s[1]!=p1 {n=0; p0=s[0]; p1=s[1]}
     s[0]==p0 && s[1]==p1 && n<4 {print}
     {++n}'

这应该打印要保存的文件。如果要删除文件列表,请将n&lt; 4更改为n&gt; 3.

答案 1 :(得分:1)

您可以分多步完成。例如,创建两个文件:

<强> pr.awk

BEGIN {
    # build regexp
    d = "[0-9]"
    YYYY = d d d d
    MM = d d
    DD = d d
    HH = d d
    sep = "-"
    r = YYYY sep MM sep DD sep HH
}

{
    fn = $0 # file name

    match($0, r)
    tag = substr(fn, RSTART, RLENGTH) # date tag

    sub(r, "", $0) # remove a tag
    rst = $0       # rest of the file name

    # sort in reverse order
    print rst, tag, fn  | "sort -r"
}

<强> del.awk

{
    nkeep = 4 # keep this number of files with the same `rst'
    rst = $1
    fn  = $3

    if (++nf[rst] <= nkeep)
        print fn
}

输入文件 input.dat

foo2013-01-01-13
foo2013-11-02-13
foo2014-01-01-13
2013-02-02-03bar
2013-08-02-01bar
2012-04-02-01bar
2013-08-08-01bar
2011-08-08-01bar
foo2014-11-05-13
foo2015-04-23-13
foo2015-08-02-12

运行管道:awk -f pr.awk input.dat | awk -f del.awk

foo2015-08-02-12
foo2015-04-23-13
foo2014-11-05-13
foo2014-01-01-13
2013-08-08-01bar
2013-08-02-01bar
2013-02-02-03bar
2012-04-02-01bar