如何捕获文件名扩展? (扩大球体)

How to capture Filename Expansion? (expanding globs)

--免责声明--
对于这个问题,我愿意接受更好的标题。

我正在尝试获取匹配文件的全名:"target/cs-*.jar".
glob 是版本号。
现在的版本是 0.0.1-SNAPSHOT.
所以,在下面,我想 jar_location 评估为 cs-0.0.1-SNAPSHOT.jar

我已经尝试了一些解决方案,其中一些有效,一些无效,我不确定我缺少什么。

有效
jar_location=( $( echo "target/cs-*.jar") ) echo "${jar_location[0]}"

不起作用
jar_location=$( echo "target/cs-*.jar") echo "$jar_location"

jar_location=( "/target/cs-*.jar" ) echo "${jar_location}"

jar_location=$( ls "target/cs-*.jar" ) echo "${jar_location}"

--编辑--
为标题添加了文件名扩展
Link 到 Bash Globbing / Filename Expansion
类似问题:The best way to expand glob pattern?

如果您使用 bash,最好的选择是使用数组来扩展 glob:

shopt -s nullglob
jar_locations=( target/cs-*.jar )
if [[ ${#jar_locations[@]} -gt 0 ]]; then
    jar_location=${jar_locations##*/}
fi

启用nullglob意味着如果没有匹配项,数组将为空;如果不启用此 shell 选项,则在没有匹配项的情况下,数组将包含文字字符串 target/cs-*.jar

如果数组的长度大于零,则设置变量,使用扩展从数组的第一个元素中删除直到最后一个 / 的所有内容。这使用 ${jar_locations[0]}$jar_locations 得到相同的东西,即数组的第一个元素。如果你不喜欢那样,你总是可以分配给一个临时变量。


GNU find 的替代方案:

jar_location=$(find target -name 'cs-*.jar' -printf '%f' -quit) 

这将打印第一个结果的文件名并退出。

请注意,如果找到多个文件,这两个命令的输出可能会有所不同。