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

Jos*_*nto 3 shell-script filenames function

我目前正在编写一个 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
Run Code Online (Sandbox Code Playgroud)

出于/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
}
Run Code Online (Sandbox Code Playgroud)

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

编辑:为什么这个问题不同于Stripping directory paths to get file names

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

jas*_*yan 7

使用参数扩展

line="/usr/share/man/man5/xpak.5.bz2"
 # printf "%s\n" "${line##*/}"                                     
 # xpak.5.bz2
file="${line##*/}"
printf "%s\n" "${file%.*}"
xpak.5
Run Code Online (Sandbox Code Playgroud)

在 Zsh 中,您可以进行嵌套参数扩展

printf "%s\n" "${${line##*/}%.*}"
xpak.5
Run Code Online (Sandbox Code Playgroud)