Scripting: In dir cd-en sofern ähnlicher Name vorhanden

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
shevegen
Beiträge: 416
Registriert: 30.03.2004 00:32:53

Scripting: In dir cd-en sofern ähnlicher Name vorhanden

Beitrag von shevegen » 19.12.2005 05:13:42

Angenommen, ich habe 2 Verzeichnisse:

abc123
und
abc321

ich tippe ein:
abc3

und drücke enter.
Normalerweise muss man ja TAB drücken, damit der Verzeichnisname komplettiert wird (gibts das Wort?)

ich möchte aber das in diesem Falle des 1. Scheiterns ein weiters cd passiert, automatisch,
und zwar mit genau dem Ersatz, den auch das TABbing verursacht hätte (also abc321)

Mit anderen Worten, ich möchte - nur für cd - eine ander faules TAB completion implementieren.
Ist so etwas überhaupt möglich?
So weit reichen meine shell script Kenntnisse nicht. Evtl gibts so etwas in einer anderen Programmiersprache?

Benutzeravatar
deadeye
Beiträge: 561
Registriert: 14.04.2004 15:32:18
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Ukio, rechts hinterm Feld
Kontaktdaten:

Beitrag von deadeye » 19.12.2005 17:41:47

Also für eine Lösung in der Shell fällt mir spontan keine Lösung ein(wobei es da auch was geben muss).
Aber Du hast ja noch nach anderen Programmiersprachen gefragt, und da sag ich DIr jetzt C. Dort gibt es glob(). Aus der Manpage:
Die Funktion glob() sucht alle Dateien, die dem Muster pattern, gemäß den Regeln der Shell, genügen und gibt sie zurück.
Alternativ gibt es zum. unter Linux, noch fnmatch().
The fnmatch() function checks whether the string argument matches the pattern argument, which is a shell wildcard pattern.
Vielleicht hilft es Dir ja.


Gruß
deadeye

ToPeG
Beiträge: 437
Registriert: 14.04.2004 00:42:06

Beitrag von ToPeG » 20.12.2005 04:31:51

Die einfachste Lösung ist eine bash-Funktion. (natürlich mußt du dann auch die bash verwenden :-)) Die Funktion trägst du in die ".bashrc" in deinem Homeverzeichnis oder /etc/bash.bashrc ein.
Sie könnte so aussehen:

Code: Alles auswählen

function cdf()
{
 x=0
 oIFS="$IFS"
 IFS="
"
 for i in `ls | grep -e "^$1"`; do
  if [ $x == 0 ]; then
   if [ -d $i ]; then 
    x=x+1
    cd $i
   fi
  fi
 done;
 IFS="$oIFS"
}
Die hier sucht sich den ersten Ordner im aktuellen Verzeichnis auf den die Eingabe irgendwie passt und wechselt dort hinein.
der Aufruf wäre wie folgt:
/$ cdf ho
So würdest du z.B im Basisverzeichnis direckt in "/home" springen (sofern es kein Verzeichnis wie "/hoehe" existiert ;-))

Benutzeravatar
C_A
Beiträge: 1082
Registriert: 22.04.2004 14:51:01
Lizenz eigener Beiträge: GNU General Public License

Beitrag von C_A » 20.12.2005 10:04:07

Jetzt hat er aber den einen Tastengewinn (vom nicht drücken müssen der Tab) durch das "f" wieder verloren, also besser noch einen Alias draus machen :wink:

Benutzeravatar
deadeye
Beiträge: 561
Registriert: 14.04.2004 15:32:18
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Ukio, rechts hinterm Feld
Kontaktdaten:

Beitrag von deadeye » 20.12.2005 11:34:59

ToPeG hat geschrieben:

Code: Alles auswählen

function cdf()
{
[...]
 for i in `ls | grep -e "^$1"`; do
[...]
}
Dein

Code: Alles auswählen

ls | grep -e "^$1"
war wohl was ich meinte, als ich sagte es muss auch etwas in der bash geben.
Aber so richtig bash is das ja auch nich, weil grep ist ein eigenes Tool (bei ls bin ich mir grade nich sicher, könnte aber auch ein Builti-I sein).
Also kommt man nich direkt an die Funktion ran, um das Drücken von TAB praktisch zu simulieren?

Gruß
deadeye

ToPeG
Beiträge: 437
Registriert: 14.04.2004 00:42:06

Beitrag von ToPeG » 20.12.2005 17:39:06

C_A hat geschrieben:Jetzt hat er aber den einen Tastengewinn (vom nicht drücken müssen der Tab) durch das "f" wieder verloren, also besser noch einen Alias draus machen :wink:
Nicht umbedingt es können ja mehrere Verzeichnisse da sein auf die die Buschataben passen, dann muß er "[Tab][Tab]", drücken, schauen usw. Zudem liegen c-d-f sehr dicht beieinander und sie lassen dich schnell hintereinander drücken.
Außerdem wäre es ganz schlecht "cd" selbst zu verstecken, denn meine Funktion hat nicht den Funktionsumfang.
deadeye hat geschrieben:

Code: Alles auswählen

ls | grep -e "^$1"
war wohl was ich meinte, als ich sagte es muss auch etwas in der bash geben.
Aber so richtig bash is das ja auch nich, weil grep ist ein eigenes Tool (bei ls bin ich mir grade nich sicher, könnte aber auch ein Builti-I sein).
Sich nur bash ist das nicht. Die Bash ist nicht mein Steckenpferd. Ich wußte es nur zufällig, da ich mal ein anderes Problem hatte (Emulation der DOS-"Shell" für einen armen Professor der es nicht mehr lernen konnte :? ) Ich kenne mich mehr mit Perl aus :-)
deadeye hat geschrieben: Also kommt man nich direkt an die Funktion ran, um das Drücken von TAB praktisch zu simulieren?
Möglichweise, da habe ich kein Ahnung. Aber mir geht es im Kopf herum, daß man in der Bash auch Aktionen auf Tastendruck auslösen kann.

Nachtrag:
Die Zeile

Code: Alles auswählen

for i in `ls | grep -e "^$1"`; do
läst sich auch so

Code: Alles auswählen

for i in $1*; do
verkürzen. Dann werden nur Bash-Befehle benutzt. :-)

Antworten