如何获取编号最大的文件夹

如何获取编号最大的文件夹

假设您有一个包含 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

相关内容