Estou recebendo algumas informações do usuário e verificando detalhes sobre isso.
Exemplo:
$HOME/Documents/test/one.txt
Tomo a string acima como entrada e quero recuperá-la one.txt
, preciso prosseguir one.txt
.
Responder1
@Jordanm já deu a resposta canônica que funciona para qualquer string. Se você estiver lidando especificamente com caminhos, também poderá usar os programas basename
e dirname
:
basename - strip directory and suffix from filenames
dirname - strip last component from file name
Por exemplo:
$ file="$HOME/Documents/test/one.txt"
$ dir=$(dirname "$file");
$ name=$(basename "$file");
$ echo "The file called $name is in the directory $dir"
The file called one.txt is in the directory /home/terdon/Documents/test
Responder2
Esta é uma tarefa comum que pode ser realizada por umexpansão de parâmetrosem qualquer shell POSIX.
path=$HOME/Documents/test/one.txt
file=${path##*/} # file contains one.txt
Outro método comum é usar o programa basename.
file=$(basename "$path")
A única desvantagem é ter que gerar um programa externo. Sua principal vantagem é que ele lida adequadamente com caminhos com um final /
.
Responder3
Se você estiver fazendo isso com nomes de arquivos, use o basename
comando:
$ basename $HOME/Documents/test/one.txt
one.txt
Avançar:
$ FILE=$(basename basename $HOME/Documents/test/one.txt)
$ echo $FILE
one.txt
Se você precisar dividir strings arbitrárias com delimitadores arbitrários, é um pouco de mágica. Leia a string em uma matriz e defina o separador do campo de entrada como o delimitador.
Aqui está um exemplo:
$ IFS='/' read -a my_array <<< "$HOME/Documents/test/one.txt"
$ ARRAY_LENGTH=$(( ${#my_array[@]} - 1 ))
$ echo "${my_array[$ARRAY_LENGTH]}"
one.txt