Supondo que você esteja tentando encontrar a parte do nome do arquivo de um nome de caminho do Windows contendo barras invertidas ...
pathname='Z:1708021541\file name with spaces.123'
filename=$(basename "${pathname//\//}")
printf '%s\n' "$filename"
Isso imprimirá
file name with spaces.123
se executado em bash
.
A substituição do parâmetro ${pathname//\//}
substitui todas as barras invertidas por barras no valor de $pathname
, o que significa que o utilitário basename
padrão pode funcionar nele. O utilitário basename
não se importa que o caminho comece com Z:
(acredita que este é o nome de um diretório).
Alternativamente (mais curto e mais portátil):
pathname='Z:1708021541\file name with spaces.123'
filename=${pathname##*\}
printf '%s\n' "$filename"
Aqui, ${pathname##*\}
removerá tudo até a última barra invertida em $pathname
. Essa substituição de parâmetro é padrão, enquanto a usada na primeira variação funcionará apenas em determinadas camadas.
Usando awk
:
printf '%s\n' "$pathname" | awk '{ sub(".*\\", "", $0); print }'
As quatro barras invertidas são duas barras invertidas que escaparam uma vez por cada, por razões.
Usando sed
:
printf '%s\n' "$pathname" | sed 's/.*\//'
As soluções awk
e sed
funcionam exatamente da mesma maneira. Eles substituem tudo até (e incluindo) a última barra invertida com uma string vazia.