In Bash, se VAR="/home/me/mydir/file.c"
, come posso ottenere "/home/me/mydir"
?
In Bash, se VAR="/home/me/mydir/file.c"
, come posso ottenere "/home/me/mydir"
?
Risposte:
dirname
e basename
sono gli strumenti che stai cercando per estrarre i componenti del percorso:
$ VAR=/home/me/mydir/file.c
$ DIR=$(dirname "${VAR}")
$ echo "${DIR}"
/home/me/mydir
$ basename "${VAR}"
file.c
Non sono comandi interni di Bash ma fanno parte dello standard POSIX (vedi dirname
, basename
) e quindi dovrebbero essere disponibili nella stragrande maggioranza dei sistemi che eseguiranno Bash.
$ export VAR=/home/me/mydir/file.c
$ export DIR=${VAR%/*}
$ echo "${DIR}"
/home/me/mydir
$ echo "${VAR##*/}"
file.c
Per evitare la dipendenza con basename
edirname
In una nota correlata, se hai solo il nome file o il percorso relativo, dirname
da solo non aiuterà. Per me, la risposta è stata readlink
.
fname='txtfile'
echo $(dirname "$fname") # output: .
echo $(readlink -f "$fname") # output: /home/me/work/txtfile
È quindi possibile combinare i due per ottenere solo la directory.
echo $(dirname $(readlink -f "$fname")) # output: /home/me/work
readlink -m "$fname"
per canonicalizzare ricorsivamente il nome dato
Se ti interessa che i file di destinazione siano link simbolici, in primo luogo puoi controllarli e ottenere il file originale. La clausola if di seguito può aiutarti.
if [ -h $file ]
then
base=$(dirname $(readlink $file))
else
base=$(dirname $file)
fi
Ci stavo giocando e ho trovato un'alternativa.
$ VAR=/home/me/mydir/file.c
$ DIR=`echo $VAR |xargs dirname`
$ echo $DIR
/home/me/mydir
La parte che mi è piaciuta è che è stato facile estendere il backup dell'albero:
$ DIR=`echo $VAR |xargs dirname |xargs dirname |xargs dirname`
$ echo $DIR
/home