2014-07-08 4 views
6

Mein Skript:How-To Root-Verzeichnis des angegebenen Pfades in bash?

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

Und nun möchte ich ersten Ordner "$ PATH" erhalten: oben/home/

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

Wie kann ich immer erkennen, die ersten Ordner wie das Beispiel? "dirname $ PATH" gibt nur "/ home/user/example/foo /" zurück.

Vielen Dank im Voraus! :)

Antwort

12

ich eine Lösung gefunden habe:

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

Dies gibt immer das erste Verzeichnis zurück. In diesem Beispiel würde es zurückgeben folgenden:

#home# 

Dank mit awk für seine Idee @condorwasabi! :)

+2

Wenn dein Pfad relativ ist und wie folgt aussieht: 'dir1/in/dir2' solltest du das Feld' -f1' anstatt '-f2' anvisieren – dmeu

1

Wenn PATH immer eine absolute Form hat, kann Sie Tricks wie

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

Oder

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

Jedoch habe ich auch hinzufügen, dass sollte, dass es besser ist, andere Variablen zu verwenden und nicht zu Verwenden Sie PATH, da dies Ihre Suchverzeichnisse für Binärdateien verändern würde, es sei denn, Sie beabsichtigen dies wirklich.

Sie können auch entscheiden, Ihren Weg zur absoluten Form durch readlink -f oder readlink -m zu konvertieren:

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

Sie auch auf meine Funktion getabspath beziehen.

+0

Sorry, aber ich verstehe das nicht. o.O Aber danke. – user2966991

+0

Gut zu schlecht. Viel Glück :) – konsolebox

0

Um den ersten firectory zu erhalten:

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

PS: Nie PATH-Variable in Ihrem Skript verwenden, da es Standardpfad Übergehungseinrichtung und Sie Skript Dienstprogramme viele Systeme nicht

nicht ausführen, um

EDIT: Wahrscheinlich sollte dies für Sie arbeiten:

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

Ich denke, der Benutzer möchte 'home' daraus extrahieren. – anishsane

+0

Hmm 'Wie kann ich immer den ersten Ordner wie das obige Beispiel erkennen 'ist nicht sehr klar. Ich habe es so interpretiert, als würde OP versuchen, das erste Verzeichnis von '/ tmp/backup' zu bekommen. – anubhava

+0

Ich begann den Kommentar mit der Absicht, Ihnen und +1 für Ihre Warnung über 'PATH' Variable zu danken. :) Dann wurde mir klar, dass die Antwort vielleicht nicht die Anforderung von OP erfüllt. – anishsane

2

Sie Diese awk können versuchen:

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

An diesem Punkt basedirectory wird die Zeichenfolge Hause Dann Sie werden schreiben:

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

Das sieht gut aus, aber es funktioniert nicht. $ basisverzeichnis ist immer leer. Aber danke! :) – user2966991

+2

Froh, dass Sie eine Lösung gefunden haben. Wie auch immer, du hattest Recht, ich habe gerade das Skript bearbeitet. Ich weiß nicht, warum ich '{print $ 1}' geschrieben habe, ich habe es auch getestet, bevor ich es gepostet habe. Jetzt sollte es funktionieren. – condorwasabi

Verwandte Themen