Dans Bash, si VAR="/home/me/mydir/file.c"
, comment puis-je obtenir "/home/me/mydir"
?
Dans Bash, si VAR="/home/me/mydir/file.c"
, comment puis-je obtenir "/home/me/mydir"
?
Réponses:
dirname
et basename
sont les outils que vous recherchez pour extraire des composants de chemin:
$ VAR=/home/me/mydir/file.c
$ DIR=$(dirname "${VAR}")
$ echo "${DIR}"
/home/me/mydir
$ basename "${VAR}"
file.c
Ils ne sont pas internes commandes Bash mais ils font partie de la norme POSIX (voir dirname
, basename
) et devrait donc être disponible sur la grande majorité des systèmes qui seront en cours d' exécution Bash.
$ export VAR=/home/me/mydir/file.c
$ export DIR=${VAR%/*}
$ echo "${DIR}"
/home/me/mydir
$ echo "${VAR##*/}"
file.c
Pour éviter la dépendance avec basename
etdirname
Sur une note connexe, si vous n'avez que le nom de fichier ou le chemin d'accès relatif, dirname
cela ne sera pas utile en soi. Pour moi, la réponse a fini par être readlink
.
fname='txtfile'
echo $(dirname "$fname") # output: .
echo $(readlink -f "$fname") # output: /home/me/work/txtfile
Vous pouvez ensuite combiner les deux pour obtenir uniquement le répertoire.
echo $(dirname $(readlink -f "$fname")) # output: /home/me/work
readlink -m "$fname"
pour
Si vous vous souciez des fichiers cibles pour être un lien symbolique, vous pouvez d'abord le vérifier et obtenir le fichier d'origine. La clause if ci-dessous peut vous aider.
if [ -h $file ]
then
base=$(dirname $(readlink $file))
else
base=$(dirname $file)
fi
Je jouais avec ça et j'ai trouvé une alternative.
$ VAR=/home/me/mydir/file.c
$ DIR=`echo $VAR |xargs dirname`
$ echo $DIR
/home/me/mydir
La partie que j'ai aimé, c'est qu'il était facile d'étendre la sauvegarde de l'arborescence:
$ DIR=`echo $VAR |xargs dirname |xargs dirname |xargs dirname`
$ echo $DIR
/home
Tout d'abord, je l'ai remplacé /
par un espace vide ( ). Ensuite, j'ai supprimé tous les caractères avant tout espace vide (
). À la fin, j'ai supprimé le premier caractère qui est un espace vide (
).
$ VAR="/home/me/mydir/file.c"
$ echo $VAR | tr '/' ' ' | sed 's/^.* / /' | cut -c2-
file.c