Ekstrak direktori dari jalur

123

Dalam skrip saya, saya memerlukan direktori file yang saya kerjakan. Misalnya, file = "stuff / backup / file.zip" . Saya membutuhkan cara untuk mendapatkan string " stuff / backup / " dari variabel $file.

Matt
sumber

Jawaban:

203
dirname $file

adalah apa yang Anda cari

Matthieu
sumber
+1, kalahkan aku untuk itu. akan lebih cepat tetapi diminta untuk memasukkan lebih daridirname $file
pertandingan baru
1
dirname "$file", lebih tepatnya. Tanpa tanda kutip ini akan berperilaku tidak semestinya jika nama file atau direktori memiliki spasi.
Charles Duffy
fml, pertanyaannya harus mengekstrak dir absolut dari file, bagaimana cara melakukannya? dirname menghasilkan jalur relatif Saya kira
Alexander Mills
Sungguh luar biasa betapa sulitnya ini dilakukan dalam skrip Batch win - alasan lain untuk tidak menggunakannya, saya kira!
bunkerdive
47
dirname $file

akan mengeluarkan

stuff/backup

yang merupakan kebalikan dari basename:

basename $file

akan menghasilkan

file.zip
korek api
sumber
Saya pikir Matt akan bisa mengetahuinya dari sana (man dirname) :)
Matthieu
1
Saya pikir kita semua Matt ada di sini. Tebak saja. Tetapi saya hanya mencoba membedakan jawaban saya dari jawaban Anda. =)
pertandingan
Ya, saya juga sering menggunakan nama dasar, itu sangat bagus =) Tapi saya tidak bisa menemukan apa-apa tentang mengembalikan dir file di google! Saya kira saya tidak mencari kata-kata yang tepat. Hah, kita bertiga Matt? : D
Matt
1
Pertimbangkan untuk menambahkan tanda kutip yang diperlukan untuk memastikan bahwa perintah ini berfungsi dengan nama yang mengandung spasi (karakter glob, dll).
Charles Duffy
3

Menggunakan ${file%/*}seperti yang disarankan oleh Urvin / LuFFy secara teknis lebih baik karena Anda tidak akan bergantung pada perintah eksternal. Untuk mendapatkan nama dasar dengan cara yang sama seperti yang Anda lakukan ${file##*/}. Tidak perlu menggunakan perintah eksternal kecuali Anda perlu.

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

Ini juga akan sepenuhnya sesuai dengan POSIX dengan cara ini. Semoga membantu! :-)

MageParts
sumber
1
Ada satu kasus di mana dirnamememiliki keunggulan dibandingkan pendekatan bawaan (lebih efisien), dan itu jika Anda tidak yakin bahwa jalur Anda sepenuhnya memenuhi syarat untuk memulai. Jika sudah file=file.zip, dirname "$file"akan kembali ., sedangkan ${file%/*}akan kembali file.zip.
Charles Duffy
1
... tentu saja, Anda dapat bercabang: case $file in */*) dir=${file%/*};; *) dir=.;; esacmasih POSIX-y dan mengatasi masalah tersebut.
Charles Duffy
2

Untuk mendapatkan directorypathdari filepath:

file="stuff/backup/file.zip"
dirPath=${file%/*}/
echo ${dirPath}
Urvin Shah
sumber
1

Cukup gunakan $ dirname /home/~username/stuff/backup/file.zip

Ini akan kembali /home/~username/stuff/backup/

Nishchay Sharma
sumber