Bash如何按目录创建时间戳排序并存储目录列表
方案1:Git仓库场景(推荐)
你可以通过Git查询每个目录的首次提交时间作为创建时间依据,实现按目录实际创建顺序遍历:
dirs='' # 按目录首次提交时间升序排列,跳过隐藏目录,兼容带空格的目录名 while IFS= read -r d; do dir_name=${d%/} tag="foobar:${dir_name}-${sha1}" dirs+="{\"app_image\":\"${tag}\",\"dir_name\":\"${dir_name}\"}," done < <(find . -maxdepth 1 -type d ! -name '.' ! -path '*/\.*' -printf '%f\0' | xargs -0 -I {} sh -c 'echo "$(git log --diff-filter=A --follow --format=%at -- "{}" | tail -1) {}"' | sort -n | cut -d ' ' -f 2-) # 可选:去掉最后多余的逗号 dirs=${dirs%,}
说明:
git log --diff-filter=A只会返回该目录首次被添加到Git仓库的提交记录,完全匹配你要的「目录创建顺序」- 排序为升序,越早创建的目录越靠前,新创建的目录会自动排在列表末尾
- 自动跳过隐藏目录,如果需要保留可以删除
! -path '*/\.*'参数
方案2:通用文件系统场景
如果Git方案不满足需求,也可以直接读取文件系统的目录创建时间(部分旧系统不支持的话会自动降级为修改时间)排序:
dirs='' while IFS= read -r -d '' d; do dir_name=${d%/} tag="foobar:${dir_name}-${sha1}" dirs+="{\"app_image\":\"${tag}\",\"dir_name\":\"${dir_name}\"}," done < <(find . -maxdepth 1 -type d ! -name '.' ! -path '*/\.*' -printf '%C@ %f\0' | sort -zn | cut -zd ' ' -f 2-) dirs=${dirs%,}
说明:
- 使用
\0作为分隔符,100%兼容带特殊字符、空格的目录名 %C@是目录的创建时间戳(部分Unix系统不支持出生时间时会返回最后修改时间)- 排序逻辑同样为升序,新目录会追加到列表末尾
内容的提问来源于stack exchange,提问作者irregular
相关产品推荐
相关产品推荐

