在shell脚本中读取目录

在shell脚本中读取目录

我想将路径下的编号目录读取到 shell 脚本中的变量中。路径是这样的:

.../releases/R1/...
.../releases/R2/...
.../releases/R3/...

每次执行脚本时,我想将最新编号的 R(在本例中为 R3)目录读取到变量中,然后将其作为参数传递给脚本内的某些函数。我该怎么做呢?

答案1

如果您使用 zsh,这是最简单的,这要归功于它全局限定符:[-1]保留最后一个匹配项并n使用数字排序,以便匹配项R9出现在 之前R10。您还可以利用其<->全局模式来匹配数字。

last_release=(releases/R<->(n[-1]))
if (($#last_release == 0)); then
  echo 1>&2 "Fatal error: no release available"
  exit 2
fi

仅使用便携式工具,最简单的方法是将数字排序卸载到sort.如果目录中只有“驯服”文件名releases(只有 ASCII 字符,没有控制字符,没有空格),则过滤 的输出ls是生成文件名列表的便捷方法。

set_last_release () {
  set -- $(ls releases | sed -n 's/^R\([0-9][0-9]*\)//p' | sort -rn)
  if [ $# -eq 0 ]; then
    echo 1>&2 "Fatal error: no release available"
    exit 2
  fi
  last_release=releases/R$1
}

如果您在版本号中使用前导零,则可以依赖 shell 的内置排序。请注意,没有可移植的方法来仅匹配由R一个或多个数字组成的文件名;在 ksh 中,您可以使用,如果您将其放在脚本的开头,releases/R+([0-9])您也可以在 bash 中使用它(它必须在解析函数和执行函数时都有效)。shopt -s extglob

set_last_release () {
  set -- releases/R[0-9]*
  if [ "$1" = 'releases/R[0-9]*' ]; then
    echo 1>&2 "Fatal error: no release available"
    exit 2
  fi
  eval last_release=\$$#
}

答案2

那个怎么样:

DIRECTORY=$(ls .../releases | tail -n 1)

只要您的目录名称可以像字符串一样排序,这就可以工作。例如,“2”将位于“12”之后,除非您将“2”实际命名为“02”

答案3

只需尝试这个:

for dir in releases/R*[0-9]/; do
   echo "$dir"
done

相关内容