Obtém o diretório pai de um determinado arquivo [duplicado]

4

Suponha que file armazene o nome do caminho de um arquivo não-dir.

Como posso obter seu diretório pai?

por que da seguinte maneira, anexando /.. ao seu valor não funciona

$ cd $file/..   
cd: ./Tools/build.bat/..: No such file or directory

Obrigado.

    
por Tim 16.03.2017 / 17:24

5 respostas

16

Assumindo

$ file=./Tools/build.bat

Com um shell compatível com POSIX (incluindo zsh):

$ echo "${file%/*}"
./Tools

Com dirname :

$ echo "$(dirname -- "$file")"
./Tools

(pelo menos o GNU dirname tem opções, então o -- é necessário no caso de o caminho começar com um traço.)

    
por 16.03.2017 / 17:29
6

Se você estiver usando zsh try :h modifier

cd $file:h

Você pode adicionar n deles para subir n na estrutura de diretórios.

    
por 16.03.2017 / 18:14
4

isso é bem simples com o comando dirname, basta fazer o seguinte:

cd "$(dirname -- "$file")"

agora você pode ir mais longe nisso

file=/home/switch87/.bashrc
cd "$(dirname -- "$file")"
cd "$(dirname -- "$file")"/..
O primeiro cd irá levá-lo para / home / switch87, o seccond para / home

    
por 16.03.2017 / 18:25
2

obtenha o diretório do arquivo de uma forma muito geral (quando o arquivo é conhecido com um nome de caminho relativo ou absoluto ou nenhum caminho):

the_dir="$(cd -P "$(dirname "${filename}")";pwd)"

Então, para obter o pai desse diretório:

the_parent_dir="$(cd -P "$(dirname "${filename}")/..";pwd)"

cd -P: imprime o caminho "real" (físico), em vez de um caminho usando links simbólicos. Se você retirar o -P , ele também funcionará, mas você poderá obter um resultado diferente (por exemplo: cd / ; ln -s /long/path/here shortcut ; cd shortcut ; pwd mostrará o caminho: /shortcut , ao passo que se você adicionou -P a cd , /long/path/here em vez disso)

    
por 16.03.2017 / 20:02
0

Eu prefiro usar uma combinação de readlink e dirname .

parent=$(readlink -f "$(dirname "$file")")
cd $parent

dirname corta o nome do arquivo do caminho e readlink -f transforma $path/.. em um caminho canônico.

    
por 16.03.2017 / 23:09