选择满足特定模式的单个目录

时间:2014-08-14 09:19:32

标签: bash shell directory

我希望能够获得与某个模式匹配的第一个目录的名称,例如:

~/dir-a/dir-b/dir-*

也就是说,如果目录dir-b包含目录dir-1dir-2dir-3,我会得到dir-1(或者,dir-3 1}})。

如果dir-b中只有一个子目录,则上面列出的选项有效,但如果有更多的子目录,则显然会失败。

1 个答案:

答案 0 :(得分:3)

您可以使用bash数组,例如:

content=(~/dir-a/dir-b/dir-*)     #stores the content of a directory into array "content"
echo "${content[0]}"              #echoes the 1st
echo ${content[${#content[@]}-1]} #echoes the last element of array "comtent"
#or, according to @konsolebox'c comments
echo "${content[@]:(-1)}"

另一种方法,制作一个bash函数,如:

first() { set "$@"; echo "$1"; }

#and call it
first ~/dir-a/dir-b/dir-*

如果您想要排序文件,而不是按名称而是通过修改时间,您可以使用下一个脚本:

where="~/dir-a/dir-b"
find $where -type f -print0 | xargs -0 stat -f "%m %N" | sort -rn | head -1 | cut -f2- -d" "

分解

  • find按定义的条件查找文件
  • xargs为每个找到的文件运行stat命令,并将结果打印为" modification_time filename"
  • sort按时间对结果进行排序
  • head获得第一个
  • cut削减了未计时的时间字段

您可以使用-mindepth 1 -maxdepth 1调整查找,以免深入了解。

在linux中,它可以更短,(使用-printf格式),但这也适用于OS X ...