在目录中查找最新的构建文件

时间:2014-11-20 09:17:27

标签: bash find

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

  1. 在给定的构建目录中搜索模式
  2. 在匹配的
  3. 中找到最新的一个
  4. 返回最新文件名的基本名称
  5. 到目前为止,我得到了这个,但它不完整

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

    我很困惑地将它排序以获得最新的

3 个答案:

答案 0 :(得分:1)

find应该可以使用statsort

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-

答案 1 :(得分:1)

对于纯粹的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

答案 2 :(得分:0)

拥有GNU find,您可以使用以下命令:

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

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