Aqui estão algumas opções:
-
basename
como sugerido por Stephane$ basename /1a/ftproot/archive/ABC/20140111_PR1_018_SALESDOC_ITEM_001.dat 20140111_PR1_018_SALESDOC_ITEM_001.dat
basename
faz parte decoreutils
e simplesmente retira o caminho dos nomes dos arquivos. -
awk
$ printf "/1a/ftproot/archive/ABC/20140111_PR1_018_SALESDOC_ITEM_001.dat" | awk -F'/' '{print $NF}'
A opção
-F
paraawk
define o separador de campo. Então, definimos isso como/
e depois imprimimos o último campo ($NF
). -
cut
$ printf "/1a/ftproot/archive/ABC/20140111_PR1_018_SALESDOC_ITEM_001.dat" | cut -d '/' -f 6
-d
é o separador de campo e-f 6
informacut
para imprimir apenas o quinto campo.Esta é uma abordagem muito limitada, uma vez que requer que você saiba o número de campos com antecedência. Uma maneira melhor seria usar
rev
(que inverte sua entrada) para fazer o último campo primeiro, depoiscut
para obter o primeiro campo e entãorev
para recuperá-lo do jeito que estava:$ printf "/1a/ftproot/archive/ABC/20140111_PR1_018_SALESDOC_ITEM_001.dat\n" | rev | cut -d/ -f1 | rev
-
Perl
$ printf "/1a/ftproot/archive/ABC/20140111_PR1_018_SALESDOC_ITEM_001.dat\n" | perl -pe 's/.+?([^\/]+)$/$1/;'
O
-p
sinalizador dizperl
para imprimir cada linha de entrada depois de executar qualquer script que seja dado como-e
. Nesse caso, simplesmente informamosperl
para substituir tudo até o trecho mais longo de caracteres que não são/
. Como esse é o Perl, existem várias maneiras de fazer isso:$ printf "/1a/ftproot/archive/ABC/20140111_PR1_018_SALESDOC_ITEM_001.dat\n" | perl -F/ -ane 'print $F[$#F]'
O sinalizador
-a
informaperl
a se comportar comoawk
, ele dividirá automaticamente cada linha de entrada na matriz@F
. Por isso, definimos o delimitador de campo como/
com-F
e depois imprimimos o último elemento da matriz($F[$#F]
). O-n
faz com queperl
faça um loop sobre sua linha de entrada por linha. -
grep
$ printf "/1a/ftproot/archive/ABC/20140111_PR1_018_SALESDOC_ITEM_001.dat" | grep -Po '[^/]+$'
O
-P
ativa os PCREs e o-o
significa "imprima apenas a string correspondente". Então, dizemos agrep
para procurar a string mais longa de não-/
até o final da string de entrada ($
). -
shell
$ foo="/1a/ftproot/archive/ABC/20140111_PR1_018_SALESDOC_ITEM_001.dat"; $ printf "${foo##*/}\n"
Isso tira proveito das habilidades de manipulação de strings do shell. Especificamente, a construção
${var##pattern}
excluirá a correspondência mais longa depattern
da frente de$var
. Então,##*/
significa apagar tudo até o último/
. -
sed
$ printf "/1a/ftproot/archive/ABC/20140111_PR1_018_SALESDOC_ITEM_001.dat\n" | sed 's/.*\///'
sed
substituirá tudo até o último/
.