전체 파일 경로에서 파일 이름(확장자 없음)을 제외한 모든 항목을 제거하려면 어떻게 해야 합니까? [복사]

전체 파일 경로에서 파일 이름(확장자 없음)을 제외한 모든 항목을 제거하려면 어떻게 해야 합니까? [복사]

나는 현재 나열된 모든 매뉴얼 페이지 equery files <PACKAGE> | grep /usr/share/man/man(익숙하지 않은 경우 equery패키지의 젠투 기반 시스템에서 사용되는 도구 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}매뉴얼 페이지의 파일 이름 전체 경로(확장자 없음)를 잘라낼 수 있는 위치를 나타냅니다. 사용자 제공 입력(이 함수에서 으로 표시됨)은 범주를 포함하여 패키지 이름을 나타냅니다(예를 들어 포티지 패키지 관리자의 경우 $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

관련 정보