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
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
> 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"
Dein Vorschlag funktioniert gut für den hinteren Teil
meines Wunschprompts - danke!
Frank
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 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"
Mift, nochmal verkehrt.
[[ "$PWD" =~ (/[^/]*/)(.*/.*)+(/.*/.*) ]] && echo "${BASH_REMATCH[1]}...${BASH_REMATCH[3]}" || echo "$PWD"
> 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?
Na datt issja ma'n Wort :)
Thänx.
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
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".
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)
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 ...
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.
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
Das letzte (und analog vorherige) sollte vermutlich besser
printf '%s ' "${PWD} $"
o.ae. sein, damit Dinge wie "\" oder "%" in Pfaden keine Probleme machen.
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 ...