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.

Matt
fonte

Respostas:

203
dirname $file

é o que você está procurando

Matthieu
fonte
+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
matchew
fonte
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! :-)

MageParts
fonte
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}
Urvin Shah
fonte
1

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

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

Nishchay Sharma
fonte