从目录中查找特定的扩展文件,并根据TCL中的修改日期打印最后5个

时间:2014-03-09 10:31:03

标签: tcl

  1. 我有一个目录,其中有一些特定扩展名的文件和其他文件 文件。

  2. 根据特定扩展名的修改日期,我需要最后五个文件。

  3. 如果超过5种,则只打印最后5个,如果少于5个 那种,打印全部。

  4. 你能帮我写一下这个tcl代码吗?

    示例1

    由于此示例中的.abc个文件少于5个,因此我们需要按照与上次修改日期相反的顺序收集所有文件:

    目录:TESTCASE

    文件:

    - apple_12.abc_no
    - banana.abc
    - dog.xyz
    - place.txt
    - sofa_1_2_12.abc
    - hello.org
    

    输出:

    - sofa_1_2_12.abc
    - banana.abc
    - apple_12.abc_no
    

    示例2:

    由于此示例中有超过5个.abc文件,因此我们需要以与上次修改日期相反的顺序排列最后五个:

    文件:

    - apple_12.abc_no
    - banana.abc
    - dog.xyz
    - place.txt
    - sofa_1_2_12.abc
    - hello.org
    - world.abc
    - stack_133_gre.abc
    - potato.txt
    - onsite_all.abc
    - list.abc
    

    输出:

    - list.abc
    - onsite_all.abc
    - stack_133_gre.abc
    - world.abc
    - sofa_1_2_12.abc
    

    我尝试通过glob命令从目录.abc中查找TESTCASE个文件:

    set PWD $pwd
    set files [glob -tails -directories $PWD/$TESTCASE/*.abc*]
    puts $files
    

    但如何尾巴持续五次或更少,是我被困的地方。我们在unix中尝试tail -f filename。在tcl中有没有办法做到这一点?

1 个答案:

答案 0 :(得分:1)

您当前的代码存在一些问题。试试这个:

# Proc to get latest 5 modified files
proc get_latest {pwd files} {

    # Container for these files
    set newList [list]

    # Loop through each files and get the modified date
    foreach f $files {
        lappend newList [list $f [file mtime $pwd/TESTCASE/$f]]
    }

    # Sort the list on date, putting latest first
    set newList [lsort -decreasing -index 1 $newList]

    # Return top 5
    return [lrange $newList 0 5]
}

# Get path of script
set PWD [pwd]

# Get files with extension
set files_with_ext [glob -tails -directory $PWD/TESTCASE *.abc*]

# Get top 5 files
set top_five [get_latest $PWD $files_with_ext]

# Finally print the file names, removing the introduced timestamps.
foreach f $top_five {
    puts [lindex $f 0]
}