Если у меня есть путь к файлу как таковой
/home/smith/Desktop/Test
/home/smith/Desktop/Test/
как мне изменить строку, чтобы получить родительский каталог?
например.
/home/smith/Desktop
/home/smith/Desktop/
Если у меня есть путь к файлу как таковой
/home/smith/Desktop/Test
/home/smith/Desktop/Test/
как мне изменить строку, чтобы получить родительский каталог?
например.
/home/smith/Desktop
/home/smith/Desktop/
dir=/home/smith/Desktop/Test
parentdir="$(dirname "$dir")"
Работает, если есть и конечная косая черта.
... но то, что "увидено здесь" нарушено. Здесь исправление:
> pwd
/home/me
> x='Om Namah Shivaya'
> mkdir "$x" && cd "$x"
/home/me/Om Namah Shivaya
> parentdir="$(dirname "$(pwd)")"
> echo $parentdir
/home/me
Если /home/smith/Desktop/Test/../
- это то, что вы хотите:
dirname 'path/to/child/dir'
как показано здесь.
Понятно, что родительский каталог задается просто добавлением имени точки dot-dot:
/home/smith/Desktop/Test/.. # unresolved path
Но вы должны захотеть разрешенный путь (абсолютный путь без каких-либо компонентов точки с точкой):
/home/smith/Desktop # resolved path
Проблема с верхними ответами, использующими dirname
, заключается в том, что они не работают, когда вы вводите путь с точками-точками:
$ dir=~/Library/../Desktop/../..
$ parentdir="$(dirname "$dir")"
$ echo $parentdir
/Users/username/Library/../Desktop/.. # not fully resolved
Это более мощный:
dir=/home/smith/Desktop/Test
parentdir=`eval "cd $dir;pwd;cd - > /dev/null"`
Вы можете подать его /home/smith/Desktop/Test/..
, но также более сложные пути, например:
$ dir=~/Library/../Desktop/../..
$ parentdir=`eval "cd $dir;pwd;cd - > /dev/null"`
$ echo $parentdir
/Users # the fully resolved path!
Просто используйте echo $(cd ../ && pwd)
во время работы в каталоге, родительский каталог которого вы хотите узнать. Эта цепочка также имеет дополнительное преимущество в том, что она не имеет косой черты.
В зависимости от того, нужны ли вам абсолютные пути, вы можете сделать дополнительный шаг:
child='/home/smith/Desktop/Test/'
parent=$(dirname "$child")
abs_parent=$(realpath "$parent")
используйте это: export MYVAR="$(dirname "$(dirname "$(dirname "$(dirname $PWD)")")")"
, если вам нужен 4-й родительский каталог
export MYVAR="$(dirname "$(dirname "$(dirname $PWD)")")"
если вы хотите директорию с тремя родителями
export MYVAR="$(dirname "$(dirname $PWD)")"
если вам нужен второй родительский каталог