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.

Jawaban:


203
dirname $file

adalah apa yang Anda cari


+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

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! :-)


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}

1

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

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.