como obter o nome de base de arquivos complicados [duplicado]

3

Aqui está um exemplo de caminho de arquivo:

/isf/GCM/VPfig/Aas/AR/ClCo el Doma Republic/VMN CRTro.txt

O que eu quero obter é o nome de base do arquivo:

VMN CRTro.txt

Então, tento o seguinte:

echo /isf/GCM/VPfig/Aas/AR/ClCo el Doma Republic/VMN CRTro.txt | sed s'/\// /g' | awk '{print $NF}'
CRTro.txt     <-- not as expected

Ou

basename  /isf/GCM/VPfig/Aas/AR/ClCo el Doma Republic/VMN CRTro.txt
basename: extra operand 'Doma'
Try 'basename --help' for more information.     <-- basename cant handle spaces 

Qual é a melhor maneira de obter o nome de base de um arquivo com espaços?

    
por maihabunash 29.07.2014 / 14:29

3 respostas

18

Apenas cite seu caminho

basename  "/isf/GCM/VPfig/Aas/AR/ClCo el Doma Republic/VMN CRTro.txt"
    
por 29.07.2014 / 14:33
11

O núcleo da questão é a citação. Sem aspas, trata o nome do arquivo como vários argumentos para basename .
Se o caminho é difícil, e não uma variável, então a resposta de rob é boa. Mas se isso faz parte de um script, onde uma variável está sendo usada, você tem duas boas soluções:

$ filepath="/isf/GCM/VPfig/Aas/AR/ClCo el Doma Republic/VMN CRTro.txt"
$ basename "$filepath"
VMN CRTro.txt

No entanto, basename é um utilitário externo e não faz parte do bash. Existe uma solução alternativa incorporada no bash:

$ filepath="/isf/GCM/VPfig/Aas/AR/ClCo el Doma Republic/VMN CRTro.txt"
$ echo "${filepath##*/}"
VMN CRTro.txt

O ${filepath##*/} diz ao bash para executar o glob */ , que corresponde a tantos caracteres quanto possível seguido por um / e, em seguida, retirá-lo.

    
por 29.07.2014 / 14:42
1

Ambas as respostas aqui são mais que suficientes - embora eu pessoalmente faça como Patrick sugere e use ${var##*/} . Ainda assim, apenas por diversão:

IFS=/ ; set -f
set -- ${0+/isf/GCM/VPfig/Aas/AR/ClCo el Doma Republic/VMN CRTro.txt}
for p do i=$((i+1))
    printf "arg#$i:\t%s\n" "${p:-/}"
done
echo now shift out...
shift $(($#-1))
printf 'arg#1:\t%s\n' "$1"

OUTPUT

arg#1:  /
arg#2:  isf
arg#3:  GCM
arg#4:  VPfig
arg#5:  Aas
arg#6:  AR
arg#7:  ClCo el Doma Republic
arg#8:  VMN CRTro.txt
now shift out...
arg#1:  VMN CRTro.txt

Você não precisa se preocupar com $IFS comendo suas avaliações de variáveis se configurá-las corretamente. Você pode até usá-lo para sua vantagem.

    
por 29.07.2014 / 15:34

Tags