代码之家  ›  专栏  ›  技术社区  ›  1pluszara

在给定文件模式的目录中保留最新的文件集

  •  1
  • 1pluszara  · 技术社区  · 7 年前

    我在一个ftp文件夹中有多个文件集,每个文件集包含一个文本和一个标记文件。 在这里,我需要从给定的目录中根据到达时间获取具有以下文件模式的最新文件集。

    文件格式:

    <FileName>_<FileID>_<Date>_<TimeStamp>.csv
    <FileName>_<FileID>_<Date>_<TimeStamp>.mrk
    

    file1在不同的时间有三个集合:

    file1_123_20180306_654321.csv
    file1_123_20180306_654321.mrk
    
    file1_123_20180306_866321.csv
    file1_123_20180306_866321.mrk
    
    file1_123_20180306_976321.csv
    file1_123_20180306_976321.mrk
    

    file2在不同的时间有两个集合:

    file2_456_20180306_277676.csv
    file2_456_20180306_277676.mrk
    
    file2_456_20180306_788988.csv
    file2_456_20180306_788988.mrk
    

    如果是一个单独的文件,我可以执行下面的命令,但如果是一个集合,我需要帮助。

    ls -t *123*.mrk | head -1
    ls -t *123*.csv | head -1
    

    我只需要保留最新的文件集(来自file1和file2)并将其他文件移到其他文件夹中。

    预期产量:

    file1_123_20180306_976321.csv
    file1_123_20180306_976321.mrk
    file2_456_20180306_788988.csv
    file2_456_20180306_788988.mrk
    

    我该如何使用shell或python2.6呢?任何帮助都非常感谢。 如果这个问题已经有了或多或少的确切答案,请指出。

    1 回复  |  直到 7 年前
        1
  •  2
  •   anubhava    7 年前

    你可以用这个 awk 要从两个文件中获取每组的最新文件项,请执行以下操作:

    printf '%s\0' *_*_*_*.csv *_*_*_*.mrk |
    awk -v RS='\0' -v ORS='\0' -F '[_.]' 'NF{a[$1,$2,$3,$NF]=$0}
       END{for (i in a) print a[i]}' |
    xargs -0 -I {} echo mv '{}' /dest/dir
    

    输出:

    mv file2_456_20180306_788988.csv /dest/dir
    mv file1_123_20180306_976321.mrk /dest/dir
    mv file1_123_20180306_976321.csv /dest/dir
    mv file2_456_20180306_788988.mrk /dest/dir
    

    当您对输出满意时,可以删除 echo 之前 mv 将这些文件移动到目标目录的命令。