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