【问题标题】:Grab the filename in Unix out of full path从完整路径中获取 Unix 中的文件名
【发布时间】:2012-04-24 20:13:29
【问题描述】:

我正在尝试使用 Unix 命令从 /this/is/could/be/any/path/abc.txt 中获取 "abc.txt"。 请注意,/this/is/could/be/any/path 是动态的。

有什么想法吗?

【问题讨论】:

    标签: bash shell unix ksh


    【解决方案1】:

    bash:

    path=/this/is/could/be/any/path/abc.txt
    

    如果您的路径中有空格,请将其包装在 "

    path="/this/is/could/be/any/path/a b c.txt"
    

    然后提取路径,使用basename function

    file=$(basename "$path")
    

    file=${path##*/}
    

    【讨论】:

    • file=${path##*/} 也可以在ksh 中工作;事实上,bash 是从 ksh 那里借用了这个特性。任何 Linux 系统上的任何 sh 都可能支持这一点。
    • 应该用双引号括起来以避免文件名中出现有趣字符的问题:file="$(basename $path)"file="${path##*/}"
    • 你的回答很好,但是如果设计者希望脚本使用有空格的路径,第一个答案需要在 $path 周围加上引号,所以:file=${basename "$path" } 。我已经编辑了答案来解决这个问题,但我认为它需要你的批准。 @Keith Thompson,file="${basename $path}" 不起作用,引号需要在 $path 上,否则 basename 函数将无法正常工作。
    • 这个真的很有用,basename也可以去掉文件扩展名。
    【解决方案2】:

    basename path 在路径末尾给出文件名

    编辑:

    可能值得补充的是,一种常见的模式是在命令周围使用反引号,例如`basename ...`,因此 UNIX shell 将执行命令并返回其文本值。

    因此要将 basename 的结果分配给变量,请使用

    x=`basename ...path...`
    

    $x 将是文件名。

    【讨论】:

    • 我已经尝试过了,basename 似乎在名称中有空格的路径上掉了下来。
    【解决方案3】:

    你可以使用 dirname 命令

    $ dirname $path
    

    【讨论】:

    • 这与 OP 要求的相反:dirname any/path/abc.txt -> any/path,而他们要求的是 abc.txt
    【解决方案4】:

    您可以使用basename /this/is/could/be/any/path/abc.txt

    【讨论】:

    • 密切关注时代...... 2012 年 4 月 12 日 13:15 与 2012 年 4 月 12 日 13:16 回答
    猜你喜欢
    • 2012-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-19
    相关资源
    最近更新 更多