В Bash, если VAR="/home/me/mydir/file.c"как получить "/home/me/mydir"?
В Bash, если VAR="/home/me/mydir/file.c"как получить "/home/me/mydir"?
Ответы:
dirnameи basenameинструменты, которые вы ищете для извлечения компонентов пути:
$ VAR=/home/me/mydir/file.c
$ DIR=$(dirname "${VAR}")
$ echo "${DIR}"
/home/me/mydir
$ basename "${VAR}"
file.c
Они не внутренние команды Bash , но они являются частью стандарта POSIX (см dirname, basename) , и поэтому должны быть доступны на подавляющем большинстве систем , которые будут под управлением Bash.
$ export VAR=/home/me/mydir/file.c
$ export DIR=${VAR%/*}
$ echo "${DIR}"
/home/me/mydir
$ echo "${VAR##*/}"
file.c
Чтобы избежать зависимости от basenameиdirname
На заметку, если у вас есть только имя файла или относительный путь, само dirnameпо себе не поможет. Для меня ответ в итоге оказался readlink.
fname='txtfile'
echo $(dirname "$fname") # output: .
echo $(readlink -f "$fname") # output: /home/me/work/txtfile
Затем вы можете объединить два, чтобы получить только каталог.
echo $(dirname $(readlink -f "$fname")) # output: /home/me/work
readlink -m "$fname"чтобы
Если вы хотите, чтобы целевые файлы были символической ссылкой, сначала вы можете проверить их и получить оригинальный файл. Условие if ниже может помочь вам.
if [ -h $file ]
then
base=$(dirname $(readlink $file))
else
base=$(dirname $file)
fi
Я играл с этим и придумал альтернативу.
$ VAR=/home/me/mydir/file.c
$ DIR=`echo $VAR |xargs dirname`
$ echo $DIR
/home/me/mydir
Часть, которая мне понравилась, это было легко расширить резервную копию дерева:
$ DIR=`echo $VAR |xargs dirname |xargs dirname |xargs dirname`
$ echo $DIR
/home