Como faço para remover todos, exceto o nome do arquivo (sem extensão) de um caminho de arquivo completo? [duplicado]

3

Atualmente, estou escrevendo uma função Bash para converter todas as páginas man listadas por equery files <PACKAGE> | grep /usr/share/man/man (se você não estiver familiarizado equery é uma ferramenta usada em sistemas baseados no Gentoo do pacote app-portage/gentoolkit ) em arquivos HTML e um pouco de informação que eu preciso para fazer isso é como eu posso remover tudo, exceto o nome da página de manual, sem sua extensão de arquivo, de seu caminho completo. Eu percebo que este fraseado pode ser confuso, então vou explicar o que quero dizer com um exemplo. A execução de equery files sys-apps/portage | grep /usr/share/man/man fornece a saída:

/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

fora desta saída, digamos que eu pegue a linha final /usr/share/man/man5/xpak.5.bz2 (que no texto que eu usei anteriormente é o caminho completo desta página man), para o propósito do meu exemplo. Então, o que eu gostaria de extrair dele, dentro de um script Bash, é xpak.5 (que é seu nome de arquivo, sem sua extensão). Como eu faria isso? Atualmente estou usando esta função 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
}

na quinta e sexta linha, eu uso a notação ${i} para indicar onde eu gostaria de poder remover o caminho completo da página de manual para o seu nome de arquivo (sem sua extensão). A entrada fornecida pelo usuário (denotada por $1 nesta função) denota o nome de um pacote, incluindo sua categoria (por exemplo, seria igual a sys-apps/portage para o gerenciador de pacotes do Portage).

EDIT: Por que essa pergunta é diferente de Como remover caminhos de diretório para obter nomes de arquivos .

As respostas desta pergunta anterior, embora parecidas com as que gostaria, não dizem como tirar as extensões de arquivo dos nomes de arquivos, apenas o resto do caminho deles. Portanto, no exemplo de /usr/share/man/man5/xpak.5.bz2 , a resposta à pergunta mencionada forneceria uma maneira de obter xpak.5.bz2 desse caminho de arquivo completo, mas não de xpak.5 .

    
por Brenton Horne 18.12.2015 / 07:02

2 respostas

6

Usando a expansão de parâmetros :

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

No Zsh, você pode fazer expansões de parâmetros aninhados :

printf "%s\n" "${${line##*/}%.*}"
xpak.5
    
por 18.12.2015 / 07:16
2

Usando 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.

Exemplo:

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

Você também pode usar sed se o sufixo for desconhecido:

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