Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

PROMPT_COMMAND / Pfadanzeige verkürzen

7 views
Skip to first unread message

Fr@nk Stef@ni

unread,
Sep 18, 2008, 3:32:13 AM9/18/08
to
Guten Morgen,

ich habe bisweilen ziemlich lange Pfadnamen und würde
die gerne sinnvoll abkürzen, wenn ich sie als Prompt
benutze. Mein Ansatz: Wenn der Pfad (`pwd`) mehr als
vier '/' enthält, also aus mindestens fünf hierarchischen
Komponenten besteht, soll nur die erste Komponente und
die letzten beiden Komponenten gezeigt werden, z.B.

sowas:

/projekt/2/Projekte/XY-Verlag/fotos/20080916-NNN_12345-ThemaDerReportage/result.rawflow/result.3000x3000/result.1890x1890/tif

zu sowas:

/projekt/2/.../result.1890x1890/tif

Ich möchte also ein bissel was vom Pfadanfang und 1-2
Verzeichnisnamen vom Ende des Pfades anzeigen lassen.

Mit "cut -d/ -f 1-2" komme ich ja gut an den Anfang, aber leider
geht das nicht vom Ende her (cut (GNU coreutils) 6.9).

Hintergrund:
Bisher zeige ich mittels PROMPT_COMMAND die Pfadnamen im Titelbalken
meiner Shell-Fenster (konsole, xterm, usw) an:

PROMPT_COMMAND=echo -ne "\033]0;${PWD}\007"

In vielen Fällen ist inzwischen mein Bildschirm zu schmal ... ;)

Danke für hilfreiche Tipps!

Frank

jakob kollmann

unread,
Sep 18, 2008, 4:28:37 AM9/18/08
to
Hallo!

Fr@nk Stef@ni wrote:
> Mit "cut -d/ -f 1-2" komme ich ja gut an den Anfang, aber leider
> geht das nicht vom Ende her (cut (GNU coreutils) 6.9).
>

pwd|rev| cut -d/ -f 1-2|rev

wäre eine Möglichkeit.

lg. jakob

--
jakob kollmann
www.filofant.org

Heike C. Zimmerer

unread,
Sep 18, 2008, 5:02:59 AM9/18/08
to
"Fr@nk Stef@ni" <f...@despammed.com> writes:

> ich habe bisweilen ziemlich lange Pfadnamen und würde
> die gerne sinnvoll abkürzen, wenn ich sie als Prompt
> benutze. Mein Ansatz: Wenn der Pfad (`pwd`) mehr als
> vier '/' enthält, also aus mindestens fünf hierarchischen
> Komponenten besteht, soll nur die erste Komponente und
> die letzten beiden Komponenten gezeigt werden, z.B.

Bash:

[[ "$PWD" =~ (/.*/)(.*/.*)+(/.*/.*) ]] && echo "${BASH_REMATCH[1]}...${BASH_REMATCH[3]}" || echo "$PWD"

Fr@nk Stef@ni

unread,
Sep 18, 2008, 5:20:16 AM9/18/08
to
jakob kollmann schrieb:

> Hallo!
>
> Fr@nk Stef@ni wrote:
>> Mit "cut -d/ -f 1-2" komme ich ja gut an den Anfang, aber leider
>> geht das nicht vom Ende her (cut (GNU coreutils) 6.9).
>>
>
> pwd|rev| cut -d/ -f 1-2|rev
^^^
Bin immer wieder erstaunt, was ich alles nicht kenne.
Mein "rev" ist Baujahr 1992.

Dein Vorschlag funktioniert gut für den hinteren Teil
meines Wunschprompts - danke!

Frank

Fr@nk Stef@ni

unread,
Sep 18, 2008, 6:16:26 AM9/18/08
to
Heike C. Zimmerer schrieb:

Hmm ... der Anfang der Ausgabe ist noch viel zu lang. Ich müsste
wohl noch mehr runde Klammerpaare definieren und dann die für die
Anpassung der Ausgabe nötige Hierarchietiefe kennen?!

Schön ist allerdings, dass man ohne Subprozesse/Pipes auskommt.

Der Vorschlag von Jakob führt dagegen (trotz Pipes) in allen
Fällen zum gewünschten Ergebnis:

echo /$(pwd|cut -d/ -f2-3)/.../$(pwd|rev|cut -d/ -f 1-2|rev)

Rein interessehalber bin ich nach wie vor an Alternativen
interessiert - ich lerne gerne dazu!

Frank

Heike C. Zimmerer

unread,
Sep 18, 2008, 6:47:16 AM9/18/08
to
"Fr@nk Stef@ni" <f...@despammed.com> writes:

> Heike C. Zimmerer schrieb:
>> "Fr@nk Stef@ni" <f...@despammed.com> writes:
>>
>>> ich habe bisweilen ziemlich lange Pfadnamen und würde
>>> die gerne sinnvoll abkürzen, wenn ich sie als Prompt
>>> benutze. Mein Ansatz: Wenn der Pfad (`pwd`) mehr als
>>> vier '/' enthält, also aus mindestens fünf hierarchischen
>>> Komponenten besteht, soll nur die erste Komponente und
>>> die letzten beiden Komponenten gezeigt werden, z.B.
>>
>> Bash:
>>
>> [[ "$PWD" =~ (/.*/)(.*/.*)+(/.*/.*) ]] && echo "${BASH_REMATCH[1]}...${BASH_REMATCH[3]}" || echo "$PWD"
>
> Hmm ... der Anfang der Ausgabe ist noch viel zu lang. Ich müsste
> wohl noch mehr runde Klammerpaare definieren und dann die für die
> Anpassung der Ausgabe nötige Hierarchietiefe kennen?!

Nö, da habe ich einen Fehler eingebaut. So sollte es klappen:

[[ "$PWD" =~ (/[^/]/)(.*/.*)+(/.*/.*) ]] && echo "${BASH_REMATCH[1]}...${BASH_REMATCH[3]}" || echo "$PWD"

Heike C. Zimmerer

unread,
Sep 18, 2008, 6:50:01 AM9/18/08
to
"Heike C. Zimmerer" <nospa...@gmx.net> writes:
[Die Ingrid ]

Mift, nochmal verkehrt.

[[ "$PWD" =~ (/[^/]*/)(.*/.*)+(/.*/.*) ]] && echo "${BASH_REMATCH[1]}...${BASH_REMATCH[3]}" || echo "$PWD"

Hauke Laging

unread,
Sep 18, 2008, 6:51:31 AM9/18/08
to
Fr@nk Stef@ni schrieb am Donnerstag 18 September 2008 09:32:

> Danke für hilfreiche Tipps!

Ich hab da auch noch was:

pwd | awk -F/ '{ printf "%s","/" $2; if(NF>2) printf "%s","/" $3;
if(NF>4) printf "%s","/...";if(NF>3) printf "%s","/" $NF;}'

Führt zu: /a/b/c
oder zu: /a/b/.../f

Kann man auch leicht in der Länge begrenzen, indem man $2, $2 usw.
durch substr($2,1,maxlaenge) ersetzt.


CU

Hauke
--
http://www.hauke-laging.de/ideen/
Wie können 59.054.087 Leute nur so dumm sein?

Fr@nk Stef@ni

unread,
Sep 18, 2008, 7:08:27 AM9/18/08
to
Heike C. Zimmerer schrieb:

Na datt issja ma'n Wort :)

Thänx.

Fr@nk Stef@ni

unread,
Sep 18, 2008, 8:19:20 AM9/18/08
to
Hauke Laging schrieb:

> Fr@nk Stef@ni schrieb am Donnerstag 18 September 2008 09:32:
>
>> Danke für hilfreiche Tipps!
>
> Ich hab da auch noch was:
>
> pwd | awk -F/ '{ printf "%s","/" $2; if(NF>2) printf "%s","/" $3;
> if(NF>4) printf "%s","/...";if(NF>3) printf "%s","/" $NF;}'
>
> Führt zu: /a/b/c
> oder zu: /a/b/.../f
>
> Kann man auch leicht in der Länge begrenzen, indem man $2, $2 usw.
> durch substr($2,1,maxlaenge) ersetzt.

Substrings wären da auch hilfreich! Man müsste etwas
erfinden, das bei beliebigen Pfaden sinnvolle Abkürzungen
zusammensetzt, sodass der Pfadname nicht länger als "n"
zeichen wird. Dann könnte man in allen Fällen etwas
aussagekräftiges anzeigen.

Danke, Frank

Helmut Hullen

unread,
Sep 18, 2008, 8:45:00 AM9/18/08
to
Hallo, Fr@nk,

Du meintest am 18.09.08:

> ich habe bisweilen ziemlich lange Pfadnamen und würde
> die gerne sinnvoll abkürzen, wenn ich sie als Prompt
> benutze. Mein Ansatz: Wenn der Pfad (`pwd`) mehr als
> vier '/' enthält, also aus mindestens fünf hierarchischen
> Komponenten besteht, soll nur die erste Komponente und
> die letzten beiden Komponenten gezeigt werden, z.B.

Kein Einzeiler:

links abschneiden (wenn der Pfad ganz gewiss mit "/" beginnt):

cut -d"/" -f2

rechts abschneiden:

Datei: basename $Datei
letztes Verz.: basename $(dirname $Datei)

Und vielleicht muss "//" (und Vielfaches) durch "/" ersetzt werden.

Viele Gruesse
Helmut

"Ubuntu" - an African word, meaning "Slackware is too hard for me".

Stefan Froehlich

unread,
Sep 18, 2008, 9:57:53 AM9/18/08
to
On Thu, 18 Sep 2008 12:16:26 +0200 Fr@nk Stef@ni wrote:
> Der Vorschlag von Jakob f?hrt dagegen (trotz Pipes) in allen
> F?llen zum gew?nschten Ergebnis:

>
> echo /$(pwd|cut -d/ -f2-3)/.../$(pwd|rev|cut -d/ -f 1-2|rev)

Aber nur, wenn Du _immer_ tief in den Verzeichnissen steckst.
Fuer die obersten 4 Ebenen wird noch ein eigener Verarbeitungszweig
benoetigt.

Servus,
Stefan

--
http://kontaktinser.at/ - die kostenlose Kontaktboerse fuer Oesterreich

Der lustige Politiker liebt Stefan. Das muß ja wohl einen Grund haben?
(Sloganizer)

Juergen Ilse

unread,
Sep 18, 2008, 2:01:51 PM9/18/08
to
Hallo,

Fr@nk Stef@ni <f...@despammed.com> wrote:
> jakob kollmann schrieb:

Wenn du dich mit einem Verzeichnis am Ende des Pfades begnuegen koenntest,
kaemst du allein mit builtins der shell auch hin (sofern du eine bash oder
ksh verwendest):

PS1='`case $PWD in
/*/*/*)
CPWD=${PWD#/}
printf /${CPWD%%/*}/.../${PWD##*/}" $ ";;
*)
printf ${PWD}" $ ";;
esac*'
--------------------------
/home/ilse $
/home/ilse $ cd ..
/home $ cd /usr/share/doc/HTML/de
/usr/.../de $
--------------------------

Was die Einzelteile dieses Inhalts der Environmentvariable PS1 genau
bedeuten und warum dieses Konstrukt so funktioniert, wie es funktioniert,
kannst du dir selbst aus der man-page heraussuchen ...
;-)

Tschuess,
Juergen Ilse (jue...@usenet-verwaltung.de)
--
Ein Domainname (auch wenn er Teil einer Mailadresse ist) ist nur ein Name,
nicht mehr und nicht weniger ...

Juergen Ilse

unread,
Sep 18, 2008, 2:23:14 PM9/18/08
to
Hallo,

Fr@nk Stef@ni <f...@despammed.com> wrote:
> Heike C. Zimmerer schrieb:
>> "Fr@nk Stef@ni" <f...@despammed.com> writes:
>>> ich habe bisweilen ziemlich lange Pfadnamen und würde
>>> die gerne sinnvoll abkürzen, wenn ich sie als Prompt
>>> benutze. Mein Ansatz: Wenn der Pfad (`pwd`) mehr als
>>> vier '/' enthält, also aus mindestens fünf hierarchischen
>>> Komponenten besteht, soll nur die erste Komponente und
>>> die letzten beiden Komponenten gezeigt werden, z.B.
>>
>> Bash:
>>
>> [[ "$PWD" =~ (/.*/)(.*/.*)+(/.*/.*) ]] && echo "${BASH_REMATCH[1]}...${BASH_REMATCH[3]}" || echo "$PWD"
>
> Hmm ... der Anfang der Ausgabe ist noch viel zu lang. Ich müsste
> wohl noch mehr runde Klammerpaare definieren und dann die für die
> Anpassung der Ausgabe nötige Hierarchietiefe kennen?!

Du hast recht. Wenn der PATH 6 oder mehr Pfadkomponenten hat, wird der
erste Teil zu lang. Das laesst sich aber leicht beheben:

[[ "$PWD" =~ (/[^/]*/)(.*/.*)+(/[^/]*//[^/]*) ]] && echo "${BASH_REMATCH[1]}...${BASH_REMATCH[3]}" || echo "$PWD"

> Schön ist allerdings, dass man ohne Subprozesse/Pipes auskommt.

Weniger schoen ist, dass es nur mit der bash funktioniert. Mein Vorschlag
aus meinem anderen Beitrag sollte auch in der ksh und sogar in der ash oder
dash funktionieren (eigentlich in jeder POSIX-Shell), und der kommt auch
mit "shell-Interna" aus. Allerdings bietet er nur eine Verzeichniskomponente
nach den Punkten (was sich aber ggfs. mit etwas mehr Aufwand und einer
weiteren "Hilfsvariablen" beheben liesse ...).

> Der Vorschlag von Jakob führt dagegen (trotz Pipes) in allen
> Fällen zum gewünschten Ergebnis:
>
> echo /$(pwd|cut -d/ -f2-3)/.../$(pwd|rev|cut -d/ -f 1-2|rev)
>
> Rein interessehalber bin ich nach wie vor an Alternativen
> interessiert - ich lerne gerne dazu!

DONE.

David Haller

unread,
Sep 18, 2008, 10:07:46 PM9/18/08
to
Hauke Laging <3q2...@hauke-laging.de> wrote:
> Fr@nk Stef@ni schrieb am Donnerstag 18 September 2008 09:32:
>
>> Danke für hilfreiche Tipps!
>
> Ich hab da auch noch was:
>
> pwd | awk -F/ '{ printf "%s","/" $2; if(NF>2) printf "%s","/" $3;
> if(NF>4) printf "%s","/...";if(NF>3) printf "%s","/" $NF;}'
>
> Führt zu: /a/b/c
> oder zu: /a/b/.../f

Ich mußte auch gleich an awk denken. Mein Vorschlag zur Fütterung per
Pipe:

awk '
BEGIN { FS = OFS = "/"; }
NF > 5 {
print $1, $2, $3, "...", $(NF-1), $NF;
next;
}
{ print; }'

Was man ggfs. noch verfeinern könnte, z.B. statt 'NF > 5'

length > 40

Für PWD ginge z.B.:

awk 'BEGIN {
FS = OFS = "/";
$0 = ENVIRON["PWD"];
if( length > 40 ) {
print $1, $2, $3, "...", $(NF-1), $NF;
} else {
print;
}
}'

was man direkt so in PROMT_COMMAND einbauen können müßte.

Da das ganze ja in der Shell passieren soll, die sowohl für PWD als
auch PROMPT_COMMAND zuständig ist, kann man IMO $PWD verwenden.

HTH,
-dnh

--
Ich habe festgestellt, wenn man die Finger in die Ohren steckt und laut summt
löst das eine ganze Menge von Problemen. -- Brig. Gen. Jack O'Neill

Martin Vaeth

unread,
Sep 19, 2008, 4:33:35 AM9/19/08
to
Juergen Ilse <il...@usenet-verwaltung.de> wrote:
> printf /${CPWD%%/*}/.../${PWD##*/}" $ ";; [...]
> printf ${PWD}" $ ";;

Das letzte (und analog vorherige) sollte vermutlich besser
printf '%s ' "${PWD} $"
o.ae. sein, damit Dinge wie "\" oder "%" in Pfaden keine Probleme machen.

Juergen Ilse

unread,
Sep 19, 2008, 6:10:08 AM9/19/08
to
Hallo,

Natuerlich, aber ich darf ja schliesslich auch mal Fehler machen, oder?
Urspruenglich stand da ein echo, dass ich erst nachtraeglich in printf
geaendert habe, allerdings ohne die dann empfehlenswerten (und von dir
voellig zu recht angemerkten) Aenderungen ...

0 new messages