假设您有一个包含 4 个子目录的父目录。每个子目录包含相同的内容。此外,每个子目录名称都是一个整数,整数越大,目录及其内容越新
例子:
父目录/
-> 1/
-> 2/
-> 6/
-> 3/
如何获取路径中指定的最大子目录,例如:
/user/mosawi/parentdir/${NEWEST}/payload.gzip
这将评估为:
/user/mosawi/parentdir/6/payload.gzip
答案1
您需要最新的目录,对吗?所以别再玩弄数字了,让我们zsh
来做吧:
NEWEST=(/user/mosawi/parentdir/*(/om[1]))
NEWESR=${NEWEST}/payload.gzip
技巧是使用 glob 限定符来排序 (哦)目录(/) 修改时间 (米)并仅获取第一个([1])。
答案2
如果数字具有相同的位数,则应采用通常的排序顺序,因此我们可以用名称填充数组并获取最后一个元素
$ mkdir -p parentdir/{1,2,6,3}
$ A=(parentdir/*) # fill an array with the names
$ echo "${A[-1]}" # print the last member of the array
parentdir/6
$ echo "${A[-1]##*/}" # remove everything up to last /
6
但如果它们的位数不同,则不起作用(顺序为1
, 13
, 2
, ...)。所以让我们手动找到最大值:
$ mkdir -p parentdir/{1,2,6,3,13}
$ max=0; # assuming they're non-negative integers!
$ for x in parentdir/* ; do
n=${x##*/}; # take just the number so that comparisons work
[ "$n" -gt "$max" ] && max=$n
done
$ echo "$max"
13
前一个方法要简单得多,如果可能的话,值得考虑创建用前导零填充到固定长度的名称。
答案3
mkdir -p parentdir/{1,2,6,3,13}
只是ls
,不排序:
ls parentdir/
1 13 2 3 6
现在排序:
ls parentdir/ -v
1 2 3 6 13
现在排序并取最后一个:
ls parentdir/ -v | tail -n1
13
优点:无循环、单行
反对:调用外部命令
答案4
假设目录名称排序正确(即它们包含相同的数字位数并且目录中没有非数字名称):
newest="$(printf '%s\n' /user/mosawi/parentdir/* | tail -n 1)"
该文件将是"$newest/payload.gzip"
.
另一个技巧是在创建新目录时创建指向最新目录的符号链接:
mkdir "parentdir/$i" && ln -sf "parentdir/$i" parentdir/latest
然后就可以轻松访问了parentdir/latest/payload.gzip
。