2014-07-08 24 views
6

Benim komut dosyası:Bash'ta verilen yolun kök dizini nasıl alınır?

#!/usr/bin/env bash 
    PATH=/home/user/example/foo/bar 
    mkdir -p /tmp/backup$PATH 

Ve şimdi "$ PATH" ilk klasörünü almak istiyorum:/home/

cd /tmp/backup 
    rm -rf ./home/ 
    cd - > /dev/null 

nasıl hep yukarıdaki örnekte olduğu gibi ilk klasörü algılayabilir? "dirname $ PATH" sadece "/ home/user/example/foo /" değerini döndürür.

Şimdiden teşekkürler! :) hep mutlak forma sahiptir

cevap

12

:

#/usr/bin/env bash 
    DIRECTORY="/home/user/example/foo/bar" 
    BASE_DIRECTORY=$(echo "$DIRECTORY" | cut -d "/" -f2) 
    echo "#$BASE_DIRECTORY#"; 

Sonra yazdığınız dize ev sahipliği yapacak bu noktada basedirectory anda

basedirectory=$(echo "$PATH" | awk -F "/" '{print $2}') 

: awk'nın komutu deneyebilirsiniz Bu her zaman ilk dizini döndürür. Bu örnekte, aşağıdaki gibi dönecektir:

#home# 

awk ile yaptığı fikri için @condorwasabi'ye teşekkürler! :)

+2

Yolunuz göreceli ve şuna benzer: 'dir1/in/dir2' sonra' -f2' yerine '-f1' alanını hedeflemelisiniz. – dmeu

1

PATH ben de diğer değişkenleri ve değil kullanmak daha iyi olduğunu buna eklemek gerekir Ancak

ROOT=${PATH#/} ROOT=/${ROOT%%/*} 

Ya

IFS=/ read -ra T <<< "$PATH" 
ROOT=/${T[1]} 

gibi hileler yapabilirsiniz Gerçekten de istemediğiniz sürece, arama dosyalarınızı ikili dosyalar için değiştireceğinden, PATH'u kullanın.

Ayrıca readlink -f veya readlink -m yoluyla mutlak forma senin yolunu dönüştürmek için tercih edebilirsiniz:

ABS=$(readlink -m "$PATH") 

Ayrıca benim işlevine getabspath başvurabilirsiniz.

path=/home/user/example/foo/bar 
mkdir -p "/tmp/backup$path" 
cd /tmp/backup 
arr=(*/) 
echo "${arr[0]}" 

PS: varsayılan PATH overrider olacak ve komut birçok sistem araçları

yürütmek mümkün olmayacak gibi komut YOL değişkeni asla kullanmayın
+0

Üzgünüz, ama bunu anlamıyorum. O.O Ama teşekkür ederim. – user2966991

+0

Eh çok kötü. İyi şanslar :) – konsolebox

0

ilk firectory almak için

DÜZENLEME: Muhtemelen bu sizin için çalışması gerekir:

IFS=/ && set -- $path; echo "$2" 
home 
+0

Bence, kullanıcı 'evden' çıkarmak istiyor. – anishsane

+0

Hmm 'Yukarıdaki örnekteki gibi ilk klasörü nasıl bulabilirim? Çok net değil. OP, '/ tmp/backup' yolundan ilk dizini almaya çalışıyormuş gibi yorumladım. – anubhava

+0

“PATH” değişkeni ile ilgili uyarınız için +1'e teşekkür etme niyetiyle yorumu başlattım. :) Daha sonra cevabın OP'nin gereksinimini karşılayamadığını fark etti. – anishsane

2

You Bir çözüm buldum

rm -rf ./"$basedirectory"/ 
+0

Bu iyi görünüyor, ama işe yaramıyor. $ basedirectory her zaman boş. Ama teşekkürler! :) – user2966991

+2

Size bir çözüm bulduğuna sevindim. Neyse haklıydın, ben sadece senaryoyu düzenledim. Neden {print $ 1} yazdım bilmiyorum, ayrıca göndermeden önce test ettim. Şimdi çalışmalı. – condorwasabi

İlgili konular