【问题标题】:Extract only filename (no directory name) in shell script [duplicate]在shell脚本中仅提取文件名(无目录名)[重复]
【发布时间】:2017-03-26 05:47:25
【问题描述】:

如何获取这些字符串中的文件?

/home/streaming/demo/youtube/Surf9B.mp4
/home/streaming/demo/Surf9B.mp4
/home/streaming/demo/youtube/test/Surf9B.mp4

我只需要获取Surf9B.mp4 并存储在一个新变量中。

【问题讨论】:

    标签: linux shell


    【解决方案1】:
    $ basename /home/streaming/demo/youtube/Surf9B.mp4
    Surf9B.mp4
    
    $ file=`basename /home/streaming/demo/youtube/Surf9B.mp4`
    $ echo "$file"
    Surf9B.mp4
    

    【讨论】:

    • 考虑在示例中使用小写变量名。 POSIX 为对 shell 和系统实用程序有意义的变量指定全大写名称,并指定至少一个小写字符的命名空间以供应用程序使用。请参阅pubs.opengroup.org/onlinepubs/009695399/basedefs/… 的第四段(关于环境变量,但命名空间约定也适用于 shell 变量,因为设置名称与当时定义的环境变量重叠的 shell 变量将覆盖后者)。
    • 也考虑引用你的扩展。 echo "$file"echo $file 更安全:如果不使用引号,如果文件名包含 IFS 中的任何字符,它们将被替换为空格;如果文件名可以解释为 glob,则如果存在扩展结果,则将其替换为扩展结果(如果不存在结果,则行为在很大程度上取决于 shell 选项配置:failglobnullglob 都适用)。
    【解决方案2】:

    您可以尝试类似的方法,但您的名称中不能包含“/”。

    SOME_VAR=$(echo "/home/streaming/demo/youtube/Surf9B.mp4" | rev | cut -f1 -d'/' | rev)
    echo $SOME_VAR
    

    【讨论】:

    • 你正在运行...让我们看看,$() 分叉一个子进程,然后revcut 和第二个rev 也是额外的外部工具...所以一个总共四个个新程序,只是为了做一些bash内置的东西?!
    • filename=/home/streaming/demo/youtube/Surf9B.mp4; echo "${filename##*/}"
    • ...此外,rev 不是 POSIX 的一部分,不是 bash 的一部分,甚至不是 Linux 标准库的一部分,因此不能保证它会安装在任何给定的系统上。
    猜你喜欢
    • 1970-01-01
    • 2015-05-24
    • 2015-04-10
    • 2016-08-26
    • 2014-02-18
    • 1970-01-01
    • 2021-06-25
    • 1970-01-01
    • 2017-09-15
    相关资源
    最近更新 更多