如何在Bash中从路径字符串中删除文件后缀和路径部分?

9 浏览
0 Comments

如何在Bash中从路径字符串中删除文件后缀和路径部分?

给定一个字符串文件路径,如/foo/fizzbuzz.bar,我如何使用bash从该字符串中提取出fizzbuzz部分?

0
0 Comments

在Bash中,有一个问题是如何从路径字符串中删除文件后缀名和路径部分。这个问题的出现是因为在某些情况下,我们需要处理文件的路径和后缀名,而不需要整个路径字符串。

解决这个问题的方法是使用纯Bash,通过两个独立的操作来实现。首先,我们需要从路径字符串中删除路径部分。这可以通过使用${path##*/}来实现,其中path是路径字符串。这个表达式会删除最后一个斜杠(/)之前的所有字符,从而得到文件名。例如,如果路径字符串是/path/to/file.txt,那么${path##*/}将返回file.txt。

接下来,我们需要从文件名中删除文件后缀名。这可以通过使用${file%.*}来实现,其中file是上一步得到的文件名。这个表达式会删除最后一个点(.)及其后面的所有字符,从而得到没有后缀名的文件名。例如,如果文件名是file.txt,那么${file%.*}将返回file。

综合起来,我们可以使用下面的代码来完整地解决这个问题:

path=/foo/bar/bim/baz/file.gif
file=${path##*/}
base=${file%.*}

在上面的代码中,我们首先定义了路径字符串path,然后使用${path##*/}将路径部分删除,得到文件名file。接着,我们使用${file%.*}将文件后缀名删除,得到没有后缀名的文件名base。

通过这种方式,我们可以在Bash中轻松地从路径字符串中删除文件后缀名和路径部分,使得我们可以更方便地处理文件的路径和后缀名。

0
0 Comments

在Bash中,有一个问题是如何从路径字符串中移除文件后缀和路径部分。某些情况下了使用basename命令的方法,可以通过指定后缀来移除,例如

NAME="$(basename /foo/fizzbuzz.bar .bar)"

,结果为NAME=fizzbuzz。这种方法最简单,但需要添加一个依赖项,并且需要知道后缀。然而,使用basename命令处理大量文件时会导致性能问题,搜索问题讨论后,某些情况下了正则表达式的方法,可以大大减少处理时间。虽然这种方法对于程序员来说更容易实现,但是时间开销太大。另外还某些情况下,避免使用外部进程是一种良好的编程原则。最后,有人发现了一个完美的解决方法,即使用basename命令的第二个参数来指定后缀。

0
0 Comments

如何通过Bash中的#和%运算符删除路径字符串中的文件后缀和路径部分?

在Bash中,可以使用#和%运算符来实现这一点。

例如,以下是如何使用%运算符来删除文件后缀的示例:

$ x="/foo/fizzbuzz.bar"
$ y=${x%.bar}
$ echo ${y##*/}
fizzbuzz

另外,可以使用%运算符的变体来删除点后的所有内容或删除第一个点后的所有内容:

${x%.bar} 可以改为 ${x%.*} 来删除点后的所有内容,或改为 ${x%%.*} 来删除第一个点后的所有内容。

例如:

$ x="/foo/fizzbuzz.bar.quux"
$ y=${x%.*}
$ echo $y
/foo/fizzbuzz.bar
$ y=${x%%.*}
$ echo $y
/foo/fizzbuzz

关于此功能的详细说明可以在Bash手册中找到,可以搜索 ${parameter%word}${parameter%%word}

我选择使用这种方法是因为它非常灵活,而且我还想实现一些类似的功能,这种方法非常适合。

这可能是所有发布答案中最灵活的方法,但我认为还应该注意到建议使用basename和dirname命令的答案。如果您不需要其他复杂的模式匹配,这两个命令可能正是您需要的。

关于${x%.bar}这是什么意思?我想了解更多。

这是"参数扩展"。在控制台上键入"man bash",然后键入"/parameter expansion"。

如果您已经了解它的功能或已经尝试过它,那么"man bash"的解释可能是有道理的。这几乎和git的参考文档一样糟糕。我建议直接在Google上搜索。

有没有办法在不使用x变量的情况下做到这一点?如果我尝试echo ${"/foo/fizzbuzz.bar.quux"%.*},我会得到-bash: ${"/foo/fizzbuzz.bar.quux"%.*}: bad substitution

不行,因为没有变量的话,这样做就没有意义了;你只需要按照原来的方式写出来就可以了。

en.wikipedia.org/wiki/Metaprogramming的上下文中,也许无法做到这一点。答案真的是"不行"吗?还是因为你觉得这样做很傻所以才这样说?

使用元编程来实现这一点甚至更加愚蠢,因为生成程序应该首先处理它并将其写为正确的字面字符串。如果它不能是字面常量,那么它将是一个变量

有时候,直接将字符串传递给参数扩展而不使用变量可能更加方便;但是不,shell不支持这样做。

比起在控制台上键入"man bash",然后键入/^ +parameter expansion,这样更方便一些。

这也适用于zsh(至少在5.8.1版本上)。

0