Bash 在目录中查找最新的生成文件

Bash 在目录中查找最新的生成文件,bash,find,Bash,Find,我需要获取当前目录中的最新生成文件。逻辑是这样的: 在给定的生成目录中搜索模式 在匹配的列表中查找最新的 返回最新文件名的basename 到目前为止,我得到了这个,但它还不完整 find ./build -iregex '.*/build_.*\.tar\.gz' -type f -exec basename {} \; 我不知道如何对它进行排序以获得最新的一个如果GNU查找,您可以使用以下命令: find ./build -iregex '.*/build_.*\.tar\.

我需要获取当前目录中的最新生成文件。逻辑是这样的:

  • 在给定的生成目录中搜索模式
  • 在匹配的列表中查找最新的
  • 返回最新文件名的basename
  • 到目前为止,我得到了这个,但它还不完整

       find  ./build  -iregex '.*/build_.*\.tar\.gz' -type f -exec basename {} \; 
    

    我不知道如何对它进行排序以获得最新的一个

    如果GNU
    查找
    ,您可以使用以下命令:

    find ./build  -iregex '.*/build_.*\.tar\.gz' -printf '%T@ %f\n' | sort -n | tail -n1 | cut -d' ' -f2
    

    它使用
    find
    的printf操作打印最新修改的时间戳以及文件名(basename)。然后它将其输送到
    sort
    ,使用
    tail
    提取最后一行,最后使用
    cut
    将名称与时间戳分离。此
    find
    应使用
    stat
    sort

    find ./build  -iregex '.*/build_.*\.tar\.gz' -type f -exec stat -c '%Y %n' {} + |
        sort -rn -k1,1 | head -1 | cut -d " " -f2-
    

    在OSX上尝试此
    sed

    find ./build  -iregex '.*/build_.*\.tar\.gz' -type f -exec stat -f '%m %N' {} + |
        sort -rn -k1,1 | head -1 | cut -d " " -f2-
    

    对于纯Bash可能性:

    #!/bin/bash
    
    shopt -s globstar nullglob nocaseglob
    
    latest=
    for file in ./build/**/build_*.tar.gz; do
        [[ -f $file ]] || continue
        [[ $latest ]] || latest=$file
        [[ $file -nt $latest ]] && latest=$file
    done
    
    if [[ $latest ]]; then
        echo "Latest build: ${latest##*/}"
    else
        echo "No builds found"
    fi
    

    我相信这是一些gnu
    find
    ,因为我在OSX上的
    find
    命令不支持
    -printf
    @anubhava是的,它是用gnu find测试的。我不知道
    -printf
    在非GNU版本的
    find
    中不受支持,不幸的是,我使用的是Mac机器,因为生成文件名的格式为build\u%Y-%m-%d-%H-%m-%S.tar.gz。这似乎起作用了:
    find./build-iregex'.*/build.*\.tar\.gz'-type f | sort-n | tail-n1 | cut-d'-f4 | cut-d'-f1
    。谢谢,这正是我在MacOSX上所需要的,我得到了
    stat:invalize选项--c
    。可能是为了gnu find?似乎我在OSX上使用gnu stat(通过自制),我现在更新了答案以使用OSX
    stat