Estoy tomando algunos comentarios del usuario y verificando los detalles al respecto.
Ejemplo:
$HOME/Documents/test/one.txt
Tomo la cadena anterior como entrada y quiero recuperarla one.txt
, necesito continuar con ella one.txt
.
Respuesta1
@Jordanm ya te ha dado la respuesta canónica que funciona para cualquier cadena. Si se trata específicamente de rutas, también puede utilizar los programas basename
y dirname
:
basename - strip directory and suffix from filenames
dirname - strip last component from file name
Por ejemplo:
$ 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
Respuesta2
Esta es una tarea común que puede ser realizada por unexpansión de parámetrosen cualquier shell POSIX.
path=$HOME/Documents/test/one.txt
file=${path##*/} # file contains one.txt
Otro método común es utilizar el programa de nombre base.
file=$(basename "$path")
La única desventaja es tener que generar un programa externo. Su principal ventaja es que maneja adecuadamente las rutas con un final /
.
Respuesta3
Si está haciendo esto con nombres de archivos, use el basename
comando:
$ basename $HOME/Documents/test/one.txt
one.txt
Más:
$ FILE=$(basename basename $HOME/Documents/test/one.txt)
$ echo $FILE
one.txt
Si necesita dividir cadenas arbitrarias con delimitadores arbitrarios, es un poco de magia. Lea la cadena en una matriz y establezca el separador del campo de entrada en el delimitador.
He aquí un ejemplo:
$ IFS='/' read -a my_array <<< "$HOME/Documents/test/one.txt"
$ ARRAY_LENGTH=$(( ${#my_array[@]} - 1 ))
$ echo "${my_array[$ARRAY_LENGTH]}"
one.txt