Übergeordnetes Verzeichnis der dritten Ebene finden

slackfan

slackfan

König
Hallo,

ich stehe gerade ein bisschen auf dem Schlauch bzw. mir fällt nur Grütze ein. Ich suche den Namen des übergeordneten Verzeichnisses in dritter Ebene.

Beispiel:
Aus "/dont/give/a/fuck/on/foo.bar" will ich "a" erhalten.

Mir fällt aber nur das hier ein:
Code:
echo $PWD | rev | cut -d"/" -f3 | rev
Kennt da jemand etwas Eleganteres?


cu
 
Hi,

also da faellt mir hoechstens noch dieser aehnlich unschoen anmutende sed Ausdruck ein:

Code:
$ foo=/dont/give/a/fuck/about/foo.bar
$ echo $foo | sed 's$.*/\(.*\)/.*/.*/.*$\1$'
a

mfg,
bytepool
 
Das ist wenigstens ein bisschen schneller :)

Danke erstmal.
 
Hi,

mir ist grad noch was eingefallen, fuer die Leute die awk lieber moegen als sed: ;)
Code:
awk -F'/' '{a=NF-3; print $a}'

mfg,
bytepool
 
Hi,

Versuch mal
Code:
DIR=$(cd ../../..; pwd)
... sollte das Gewünschte liefern - ohne allzuviele Child-Prozesse anwerfen zu müssen ...

Gruss
 
Fuege man an floyd62's Vorschlag noch ein 'basename $DIR' an, dann bekommst Du den entpsrechenden Namen den Du suchst.
 
Das ist wahr. Werde es nehmen. Sieht am verständlichsten aus und es ist sogar minimal am schnellsten. Bei mir zumindest.

Code:
#!/bin/sh

mkdir -p ./dont/give/a/fuck/on/foo/bar
cd ./dont/give/a/fuck/on/foo/bar

time for i in {1..500}; do basename $(cd ../../..; pwd) > /dev/null; done

time for i in {1..500}; do pwd | awk -F'/' '{a=NF-3; print $a}' > /dev/null; done

time for i in {1..500}; do pwd | sed 's$.*/\(.*\)/.*/.*/.*$\1$' > /dev/null; done

time for i in {1..500}; do pwd | rev | cut -d"/" -f4 | rev > /dev/null; done
liefert
Code:
real    0m1.778s
user    0m0.536s
sys     0m1.356s

real    0m1.893s
user    0m0.732s
sys     0m1.672s

real    0m1.941s
user    0m0.896s
sys     0m1.464s

real    0m9.348s
user    0m12.249s
sys     0m4.292s
 
Zuletzt bearbeitet:
Zurück
Oben