フルファイルパスからファイル名(拡張子なし)を除くすべてのエントリを削除するにはどうすればよいですか? [コピー]

フルファイルパスからファイル名(拡張子なし)を除くすべてのエントリを削除するにはどうすればよいですか? [コピー]

私は現在リストされているすべてのマニュアルページequery files <PACKAGE> | grep /usr/share/man/man(慣れていない場合はequeryパッケージのGentooベースのシステムで使用されるツールapp-portage/gentoolkit)をHTMLファイルと必要ないくつかの情報に変換するBash関数を書いています。フルパスからマニュアルページ名(ファイル拡張子なし)を除くすべてのエントリを削除するにはどうすればよいですか?この表現が混乱する可能性があることを知っているので、例えば私が意味するものを説明します。実行すると、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
}

5行目と6行目では、記号を使用して${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

関連情報