Extrair diretório do caminho


123

No meu script, preciso do diretório do arquivo com o qual estou trabalhando. Por exemplo, o arquivo = "stuff / backup / file.zip" . Eu preciso de uma maneira de obter a string " stuff / backup / " a partir da variável $file.

Respostas:


203
dirname $file

é o que você está procurando


+1, me derrote. teria sido mais rápido, mas foi prompoted inserir mais dedirname $file
matchew

1
dirname "$file", em vez. Sem as aspas, isso se comportará mal se o nome do arquivo ou diretório tiver espaços.
Charles Duffy

fml, a questão deve ser extrair dir absoluto do arquivo, como faço isso? dirname produz caminho relativo, eu acho
Alexander Mills

É notável o quão difícil é conseguir isso em um script de lote do Win - outro motivo para não usá-los, suponho!
bunkerdive 22/04

47
dirname $file

irá produzir

stuff/backup

que é o oposto de basename:

basename $file

produziria

file.zip

Imaginei Matt seria capaz de descobrir a partir daí (homem dirname) :)
Matthieu

1
Acho que somos todos Matt aqui. Apenas um palpite. Mas eu estava apenas tentando distinguir minha resposta da sua. =)
matchew

Sim, eu também uso muito o basename, é muito bacana =) Mas não consegui encontrar nada sobre o retorno do diretório do arquivo no google! Acho que não estava procurando as palavras certas. Hah, todos nós três, Matt? : D
Matt

1
Considere adicionar as aspas necessárias para garantir que esses comandos funcionem com nomes que contenham espaços (caracteres globos, etc.).
Charles Duffy

3

Usar ${file%/*}como sugerido por Urvin / LuFFy é tecnicamente melhor, pois você não dependerá de um comando externo. Para obter o nome da base da mesma maneira que você poderia fazer ${file##*/}. Não é necessário usar um comando externo, a menos que você precise.

file="/stuff/backup/file.zip"
filename=${1##*/}     # file.zip
directory=${1%/*}     # /stuff/backup

Também seria totalmente compatível com POSIX dessa maneira. Espero que ajude! :-)


1
um caso em que dirnamehá uma vantagem sobre a abordagem interna (mais eficiente), e é se você não tiver certeza de que seu caminho está totalmente qualificado para começar. Se você tiver file=file.zip, dirname "$file"retornará ., enquanto ${file%/*}retornará file.zip.
Charles Duffy

1
... é claro, você pode ramificar: case $file in */*) dir=${file%/*};; *) dir=.;; esacainda está no POSIX-y e soluciona o problema.
Charles Duffy

2

Para obter directorypathdo filepath:

file="stuff/backup/file.zip"
dirPath=${file%/*}/
echo ${dirPath}

1

Basta usar $ dirname /home/~username/stuff/backup/file.zip

Vai voltar /home/~username/stuff/backup/

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.