【问题标题】:Delete everything before last / in a file path删除文件路径中最后 / 之前的所有内容
【发布时间】:2015-06-27 23:08:53
【问题描述】:

我在一个文件中有许多文件路径,如下所示:

/home/rtz11/files/testfiles/547/prob547455_01

我想使用 bash 脚本将所有文件名打印到屏幕上,基本上是最后一个 / 之后的任何内容。我不想假设它总是相同的长度,因为它可能不是。

有没有办法删除最后一个/ 之前的所有内容?也许是sed 命令?

【问题讨论】:

  • 要删除最后一个/,还是只删除它之前的内容?

标签: bash filepath


【解决方案1】:

为此使用sed 太过分了——bash 内置了广泛的字符串操作,并且仅在单行上操作时使用此内置支持的效率要高得多。

s=/home/rtz11/files/testfiles/547/prob547455_01
basename="${s##*/}"
echo "$basename"

这将删除字符串开头贪婪匹配*/ 的所有内容。见the bash-hackers wiki entry for parameter expansion


如果您只想删除 最后一个 / 之前的所有内容,但不包括它(对您的问题的字面理解,但通常也是一个不太有用的操作),您可能想要if [[ $s = */* ]]; then echo "/${s##*/}"; else echo "$s"; fi.

【讨论】:

  • 优秀的资源。旁注,如果您需要文件路径,请使用${PATHNAME%/*}
【解决方案2】:
awk '{print $NF}' FS=/ input-file

'print $NF' 指示 awk 打印每行的最后一个字段,并指定 FS=/ 使正斜杠字段分隔符。在 sed 中,你可以这样做:

sed 's@.*/@@' input-file

这只是删除直到并包括最后一个 / 的所有内容。

【讨论】:

  • 请注意,@ 符号只是 used here as a delimiter,替换了通常的正斜杠 /。后者不能轻易使用,因为它构成了目标。等效命令为sed s|.*/||'sed 's:.*/::'
【解决方案3】:

曲折,只是因为我能记住我使用的语法:

cat file | rev | cut -d/ -f1 | rev

给“猫”剥皮的多种方法。哎哟。

【讨论】:

  • 这太贵了,虽然它做得很好。
【解决方案4】:

另一种方式:

使用 basename 可执行文件(命令):

basename /path/with/many/slashes/and/file.extension

>file.extension

basename /path/with/many/slashes/and/file.extension .extension

basename -s .extension /path/with/many/slashes/and/file.extension 

> file

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-07
    • 1970-01-01
    • 1970-01-01
    • 2021-02-13
    • 2017-05-04
    • 2020-03-03
    • 2017-12-31
    • 2015-08-13
    相关资源
    最近更新 更多