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.