给定一个字符串文件路径,例如/foo/fizzbuzz。酒吧,我如何使用bash提取只是fizzbuzz部分说的字符串?
当前回答
纯bash,在两个独立的操作中完成:
从路径字符串中移除路径: 路径= / foo / bar / bim /巴兹/ file.gif 路径文件= $ {# # * /} #$file现在是file.gif 从路径字符串中移除扩展名: 基础= ${文件%。*} #${base}现在是“文件”。
其他回答
如果您想只保留带扩展名的文件名并删除文件路径
$ x="myfile/hello/foo/fizzbuzz.bar"
$ echo ${x##*/}
$ fizzbuzz.bar
Bash手册中的解释,请参见${parameter##word}
使用basename假设您知道文件扩展名是什么,不是吗?
而且我相信各种正则表达式建议不能处理包含多个“”的文件名。
下面的内容似乎可以解决双点问题。哦,还有本身包含“/”的文件名(只是为了好玩)
用帕斯卡尔的话来说,“对不起,这个脚本太长了。我没有时间把它缩短。”
#!/usr/bin/perl
$fullname = $ARGV[0];
($path,$name) = $fullname =~ /^(.*[^\\]\/)*(.*)$/;
($basename,$extension) = $name =~ /^(.*)(\.[^.]*)$/;
print $basename . "\n";
basename和dirname函数是你需要的:
mystring=/foo/fizzbuzz.bar
echo basename: $(basename "${mystring}")
echo basename + remove .bar: $(basename "${mystring}" .bar)
echo dirname: $(dirname "${mystring}")
输出:
basename: fizzbuzz.bar
basename + remove .bar: fizzbuzz
dirname: /foo
使用basename我使用以下方法来实现这一点:
for file in *; do
ext=${file##*.}
fname=`basename $file $ext`
# Do things with $fname
done;
这不需要对文件扩展名的先验知识,即使你的文件名中有点(在它的扩展名前面)也可以工作;虽然它确实需要程序基名,但这是GNU coreutils的一部分,所以它应该随任何发行版一起发布。
basename会移除路径。它还将删除给定的后缀,如果它与文件的后缀匹配,但您需要知道为命令提供的后缀。否则,你可以用mv,用其他方法找出新名称。