У 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