Linux:仅在字符串中查找最后一个'/'的位置

问题描述

我有这个字符串:

/sandbox/US_MARKETING/COMMON_DATA/BAU/FILES/2020/08/dnb_mi_081420.gz

在不知道其中有多少个'/'的情况下,我希望能够仅将文件读入变量。

我希望能够从行的最后一个'/'开始搜索,并找到文件名'dnb_mi_081420.gz'。

我想基本上说“找到字符串中的最后一个'/',然后读取它后面的子字符串并将其存储。

所以我知道它看起来像这样:

filename=substr(<position of the last'/'>,<position of first character in last string>)

所以我想找到要查找的最后一个'/'的索引位置的方法。

有人知道那是什么吗?

我也尝试使用basename,不幸的是,我正在通过'hdfs dfs'进行此操作以获取hadoop shell。因此,某些非标准Linux命令(例如basename)不在该词汇表中。我基本上将必须将整个字符串存储在变量中,然后对该变量值进行操作。

解决方法

在bash中,可以使用parameter expansion

$ {parameter ## word}

单词将被扩展以产生一个模式,并根据下面描述的规则进行匹配(请参见模式匹配)。如果模式与参数的扩展值的开头匹配,则扩展的结果是具有最短匹配模式(“#”情况)或最长匹配模式(“ ##”情况)的参数扩展值删除

示例:

$ s="/sandbox/US_MARKETING/COMMON_DATA/BAU/FILES/2020/08/dnb_mi_081420.gz" && echo ${s##*/}
dnb_mi_081420.gz
$
,

您可以使用-state子命令以指定格式提取有关文件的信息和统计信息。由于您只需要文件名,因此格式仅为"%n"

hdfs dfs -stat "%n" /path/to/file

这可能比基于原始索引的解决方案昂贵,但不应对性能造成有意义或明显的影响。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...