Подтвердить что ты не робот

Получение родителя каталога в Bash

Если у меня есть путь к файлу как таковой

/home/smith/Desktop/Test
/home/smith/Desktop/Test/

как мне изменить строку, чтобы получить родительский каталог?

например.

/home/smith/Desktop
/home/smith/Desktop/
4b9b3361

Ответ 1

dir=/home/smith/Desktop/Test
parentdir="$(dirname "$dir")"

Работает, если есть и конечная косая черта.

Ответ 2

... но то, что "увидено здесь" нарушено. Здесь исправление:

> pwd
/home/me
> x='Om Namah Shivaya'
> mkdir "$x" && cd "$x"
/home/me/Om Namah Shivaya
> parentdir="$(dirname "$(pwd)")"
> echo $parentdir
/home/me

Ответ 3

Если /home/smith/Desktop/Test/../ - это то, что вы хотите:

dirname 'path/to/child/dir'

как показано здесь.

Ответ 4

Понятно, что родительский каталог задается просто добавлением имени точки 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!

Ответ 5

Просто используйте echo $(cd ../ && pwd) во время работы в каталоге, родительский каталог которого вы хотите узнать. Эта цепочка также имеет дополнительное преимущество в том, что она не имеет косой черты.

Ответ 6

В зависимости от того, нужны ли вам абсолютные пути, вы можете сделать дополнительный шаг:

child='/home/smith/Desktop/Test/'
parent=$(dirname "$child")
abs_parent=$(realpath "$parent")

Ответ 7

используйте это: export MYVAR="$(dirname "$(dirname "$(dirname "$(dirname $PWD)")")")", если вам нужен 4-й родительский каталог

export MYVAR="$(dirname "$(dirname "$(dirname $PWD)")")" если вы хотите директорию с тремя родителями

export MYVAR="$(dirname "$(dirname $PWD)")" если вам нужен второй родительский каталог