如何从完整文件路径中删除除文件名(无扩展名)之外的所有内容?

如何从完整文件路径中删除除文件名(无扩展名)之外的所有内容?

我目前正在编写一个 Bash 函数,用于将列出的所有手册页equery files <PACKAGE> | grep /usr/share/man/man(如果您不熟悉的话,equery是来自包中的基于 Gentoo 的系统上使用的工具app-portage/gentoolkit)转换为 HTML 文件和我需要的一点信息这就是我如何从其完整路径中删除除手册页名称(不带文件扩展名)之外的所有内容。我意识到这个措辞可能会令人困惑,所以我将用一个例子来解释我的意思。运行equery files sys-apps/portage | grep /usr/share/man/man给出输出:

/usr/share/man/man1
/usr/share/man/man1/dispatch-conf.1.bz2
/usr/share/man/man1/ebuild.1.bz2
/usr/share/man/man1/egencache.1.bz2
/usr/share/man/man1/emaint.1.bz2
/usr/share/man/man1/emerge.1.bz2
/usr/share/man/man1/emirrordist.1.bz2
/usr/share/man/man1/env-update.1.bz2
/usr/share/man/man1/etc-update.1.bz2
/usr/share/man/man1/fixpackages.1.bz2
/usr/share/man/man1/quickpkg.1.bz2
/usr/share/man/man1/repoman.1.bz2
/usr/share/man/man5
/usr/share/man/man5/color.map.5.bz2
/usr/share/man/man5/ebuild.5.bz2
/usr/share/man/man5/make.conf.5.bz2
/usr/share/man/man5/portage.5.bz2
/usr/share/man/man5/xpak.5.bz2

在此输出中,出于我的示例的目的,我采用了最后一行/usr/share/man/man5/xpak.5.bz2(在我之前使用的措辞中是此手册页的完整路径)。然后我想在 Bash 脚本中从中提取的是xpak.5(这是它的文件名,没有扩展名)。我该怎么做?我目前正在使用这个 Bash 函数:

function manhtmlp {
  for i in `equery files "$1" | grep /usr/share/man/man`
  do
    bzcat $i | mandoc -Thtml > $HOME/GitHub/fusion809.github.io/man/${i}.html
    sudo chmod 777 -R $HOME/GitHub/fusion809.github.io/man/${i}.html
  done
}

在第五行和第六行中,我使用符号${i}来指示我希望能够在何处修剪手册页的文件名完整路径(不带扩展名)。用户提供的输入(在此函数中用 表示)表示包的名称,包括其类别(例如,对于 Portage 包管理器而言,$1它等于)。sys-apps/portage

编辑:为什么这个问题不同于剥离目录路径以获取文件名

上一个问题的答案虽然与我想要的类似,但并不告诉人们如何从文件名中删除文件扩展名,而只是告诉他们路径的其余部分。因此,在上述问题的答案示例中,/usr/share/man/man5/xpak.5.bz2将提供一种摆脱此完整文件路径的方法xpak.5.bz2,但不是xpak.5.

答案1

使用参数扩展:

line="/usr/share/man/man5/xpak.5.bz2"
 # printf "%s\n" "${line##*/}"                                     
 # xpak.5.bz2
file="${line##*/}"
printf "%s\n" "${file%.*}"
xpak.5

在 Zsh 中,你可以这样做嵌套参数扩展:

printf "%s\n" "${${line##*/}%.*}"
xpak.5

答案2

使用basename:

NAME
       basename - strip directory and suffix from filenames

SYNOPSIS
       basename NAME [SUFFIX]
       basename OPTION... NAME...

DESCRIPTION
       Print NAME with any leading directory components removed.  If specified, also remove a trailing SUFFIX.

例子:

$ file="/usr/share/man/man5/xpak.5.bz2"
$ echo "$(basename "$file" .bz2)"
xpak.5

sed如果后缀未知,您也可以使用:

$ file="/usr/share/man/man5/xpak.5.bz2"
$ echo "$(basename "$file" | sed 's/\(.*\)\..*/\1/')"
$ xpark.5

相关内容