Archiv verlassen und diese Seite im Standarddesign anzeigen : Script für Substs
Exitus222
15.11.2006, 10:45
Ich bin neu in der Bash welt und finde mich schwer zurecht.
Ich soll ein script schreiben das mit auflistet welche Subst gemacht worden, für ein ganz spezielles Verzeichnis
Das ist klappt ja noch
z.b X: -> C:Hallo/bla bla
Y: -> C:Hallo/bla bla
alreadySubstituted='subst |grep -i Hallo'
Aber das problem geht weiter denn wenn ich wie oben auf X und Y das selbe habe soll das script dieses erkennen und einen der beiden löschen.
Aber ich weiss nicht wie ich vergleiche? bzw was ich überhaput tun kann...
bin sehr verzweifelt :confused: :(
Exitus222
15.11.2006, 11:36
Bzw kann mir jemand sagen wie ich aus einer Variable die mir jetzt meine ganzen gegrapten substs enthält jeweils nur eine zeit auslese ?
Beispiel
allreadySubstituted enthält
V:\: => G:\Hallo\N4_
W:\: => G:\Hallo\N4_
Z:\: => G:\HAllo\N4_A2
Um jetzt zu vergleichen welche hier gleich sind also in dem fall V: und W: müste ich das was in meiner Variable allreadySubstituted irgendwie zeilenweise heraus "grepen" oder wie auch immer
Hallo, kannst du bitte angeben, mit welcher Shell du arbeitest.
Exitus222
16.11.2006, 13:28
Hmmm gute frage...
Jedenfalls steht das in der Shell bash-2.05b$
Aber das geht lagnsam vorn mit meinem Problem doch möchte ich euch fragen wie man ein Array bildet.
Bzw ganz gezielt Elemente entfernt
mit
alreadySubsts=(`subst | grep -i Hallo`)
Lege ich mir dies alles ja als Array an
V:\: => G:\Hallo\N4_
W:\: => G:\Hallo\N4_
Z:\: => G:\HAllo\N4_A2
Dh in alreadySubst[0] steht jetzt V:\: in [1] => usw usw
Wie kann ich z.b das => entfernen ebenso wie :\: so das nur noch V da steht?
Exitus222
16.11.2006, 15:20
Nun ich habe weiterrumprobiert und gesurft und habe etwas gefunden
->Muster und Mustervergleiche
${variable//muster/string}
Aber leider klappt das bei mir nicht
${alreadySubst//:\:/} ebensowenig klappt
${alreadySubst//Hallo/Du}
Er liefert mir ständig
line 9: V:\:: command not found
Ich antworte mal querbeet auf ein paar Fragen.
--- >8 ------ 8< ---
Wie kann ich z.b das => entfernen ebenso wie :\: so das nur noch V da steht?
$ bash --version
GNU bash, version 3.2.3(5)-release (i686-pc-cygwin)
Copyright (C) 2005 Free Software Foundation, Inc.
$ a="v:\\:"
$ echo ${a%:\\:}
v
Hier wird das entfernen von Suffixen angewendet. Der Backslash muß auch innerhalb der doppelten Anführungszeichen 'gequotet' werden. Ich benutzt eine neuerer Version von Bash als du, aber diese Funktionalität ist auch schon in der 2er drin.
--- >8 ------ 8< ---
Um jetzt zu vergleichen welche hier gleich sind also in dem fall V: und W: müste ich das was in meiner Variable allreadySubstituted irgendwie zeilenweise heraus "grepen" oder wie auch immer
$ subst
H: => C:\EIGENE DATEIEN
J: => C:\EIGENE DATEIEN
K: => C:\EIGENE DATEIEN\EIGENE DOWNLOADS
$ subst | sort -u +2 | xargs -n 1 -d \\n echo "-->"
--> H: => C:\EIGENE DATEIEN
--> K: => C:\EIGENE DATEIEN\EIGENE DOWNLOADS
$ sort --version
sort (GNU coreutils) 6.4
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software. You may redistribute copies of it under the terms of
the GNU General Public License <http://www.gnu.org/licenses/gpl.html>.
There is NO WARRANTY, to the extent permitted by law.
Written by Mike Haertel and Paul Eggert.
$ xargs --version
GNU xargs version 4.3.1
Ob du sort und xargs hast und deren Versionen das gleiche liefern wie meine muß sich erst noch bei dir zeigen. Ansonsten kann man xargs dafür verwenden die Ausgabe von subst zeilenweise an einen Befehl (hier echo "-->") als Parameter zu übergeben. Durch sort -u +2 werden die Zeilen ab den zweiten Zeichen sortiert und doppelte Zeilen (auch erst nach dem zweiten Zeichen) werden entfernt.
Exitus222
20.11.2006, 10:06
Hi, Mr.Homm
Erstmal vielen dank für deine hilfe. Das hat mir echt weitergeholfen danke und big thx.
Nur eine sache leider nicht
$ subst
H: => C:\EIGENE DATEIEN
J: => C:\EIGENE DATEIEN
K: => C:\EIGENE DATEIEN\EIGENE DOWNLOADS
$ subst | sort -u +2 | xargs -n 1 -d \\n echo "-->"
--> H: => C:\EIGENE DATEIEN
--> K: => C:\EIGENE DATEIEN\EIGENE DOWNLOADS
Denn ich möchte mit dem Script ja doppelt gesubstitutete Laufwerke wieder freigeben. In dem fall hier oben jetzt also entweder H oder J mit dem Befehl von dir habe ich allderdings irgndwie keine möglichkeit mehr zu vergleichen welche den überhaupt gleich sind bzw waren...[/COLOR]
Dann mußt du nur noch feststellen, welche Zeilen von sort gelöscht wurden.
subst | sort +2 >subst.out; subst | sort -u +2 | diff subst.out - | grep ^\< Dafür bietet sich der diff Befehl an, der Unterschiede zwischen zwei Dateien anzeigt. Oben ist die eine Datei subst.out, welche im ersten Teil (bis zum Semikolon) erzeugt wird. Als zweite Datei wird beim diff mittels des Bindestriches der Eingabestrom gewählt. Das abschließende grep entfern die Zeilenangaben von der diff-Ausgabe.
Exitus222
22.11.2006, 11:05
Hi, Erstmal riesen Dank Mr. Homm du hast mir wirklich den richtigen anstoss in die Richtige Richtung geben und das mir sehr geholfen. Ich habe es zwar nicht so realisiert wie du aber immerhin es klappt.
Jetzt kommt allerdings eine neue Frage auf.
Wie finde ich DEAD-SUBSTS raus?
Sprich ich habe z.b einen Stick gesubstituded, auf meinetwegen G:/Progs so jetzt ziehe ich ihn ab d.h G:/Progs ist noch sichtbar jedoch nicht mehr verfügbar ;)
Gibt es in der Bash sowas wie "exists" oder womit sich überprüfen läst, ja gibts das den eigentlich noch?
Hi, Erstmal riesen Dank Mr. Homm du hast mir wirklich den richtigen anstoss in die Richtige Richtung geben und das mir sehr geholfen. Ich habe es zwar nicht so realisiert wie du aber immerhin es klappt.
Jetzt kommt allerdings eine neue Frage auf.
Wie finde ich DEAD-SUBSTS raus?
Sprich ich habe z.b einen Stick gesubstituded, auf meinetwegen G:/Progs so jetzt ziehe ich ihn ab d.h G:/Progs ist noch sichtbar jedoch nicht mehr verfügbar ;)
Gibt es in der Bash sowas wie "exists" oder womit sich überprüfen läst, ja gibts das den eigentlich noch?
Dafür ist der Befehl test da. Z.B.
test -d e:\\ || echo e:\\ ist nicht verfügbar
vBulletin® v3.8.6, Copyright ©2000-2012, Jelsoft Enterprises Ltd.