Estou tentando usar awk
para obter o nome de um arquivo, dado o caminho absoluto para o arquivo.
Por exemplo, ao receber o caminho de entrada /home/parent/child/filename
que gostaria de obter filename
, tentei:
awk -F "/" '{print $5}' input
que funciona perfeitamente.
No entanto, estou codificando, o $5
que seria incorreto se minha entrada tivesse a seguinte estrutura:
/home/parent/child1/child2/filename
Portanto, uma solução genérica exige sempre pegar o último campo (que será o nome do arquivo).
Existe uma maneira simples de fazer isso com a função substr do awk?
basename
é a forma oficial de fazer isso, usarawk
para isso não é bom para dizer o mínimo. : DRespostas:
Use o fato de que
awk
divide as linhas em campos com base em um separador de campo, que você pode definir. Portanto, definindo o separador de campo para/
você pode dizer:como
NF
se refere ao número de campos do registro atual, impressão$NF
significa imprimir o último.Então, dado um arquivo como este:
Este seria o resultado:
fonte
$(NF-1)
.Nesse caso, é melhor usar em
basename
vez deawk
:fonte
dirname
faz o oposto e remove o arquivo, não o caminho.Outra opção é usar a
bash
substituição de parâmetro .fonte
Se você está aberto a uma solução Perl, aqui está uma semelhante à solução awk de Fedorqui:
-F/
especifica/
como o separador de campo$F[-1]
é o último elemento na@F
matriz de divisão automáticafonte
Deve ser um comentário para a resposta do nome de base, mas não tenho motivos suficientes.
Se você não usar aspas duplas,
basename
não funcionará com o caminho onde há caractere de espaço:ok com aspas ""
exemplo de arquivo
fonte
Eu sei que estou cerca de 3 anos atrasado nisso, mas .... você deve considerar a expansão dos parâmetros, é embutida e mais rápida.
se sua entrada estiver em uma var, digamos, $ var1, basta fazer
${var1##*/}
. Olhe abaixofonte
Tipo 5 anos atrasado, eu sei, obrigado por todas as propostas, eu costumava fazer isso da seguinte maneira:
Fico feliz em notar que existem maneiras melhores
fonte
Você também pode usar:
ou
fonte