• Das kreative Thema des Monats Oktober wird vor allem diejenigen unter Euch besonders ansprechen, denen Do-it-yourself quasi im Blut liegt. Zeigt uns Eure Improvisationskünste oder fotografiert, was andere Leute sich so im Alltag zusammengestrickt haben. --> Zum Mitmachen bitte hier klicken

Dateinamen von Pfad entfernen

Decomposition

Antonowka
Registriert
09.12.06
Beiträge
363
Hallo,
ich möchte den Dateinamen samt Suffix von einem Pfad entfernen, sodass mir nur der Pfad ausgegeben wird:

file:///Volumes/Templates/file.ext
=>
file:///Volumes/Templates/

Ich bekomme alles mögliche mit den text delimitern hin, zum Beispiel dass reine ausgeben des Dateinamens; aber eben nicht in die andere Richtung. Ich dachte mir dass ich vielleicht sagen könnte "gehe von hinten bis zum ersten / und lösche alles bis dahin" ...
kann mir jemand helfen?

danke
 
Hallo,

keine Ahnung, wie man das "richtig" macht ....
Ich würde es so schreiben

set theFile to "file:///Volumes/Templates/file.ext"
set revChar to reverse of (characters of theFile) as string
set x to (offset of "/" in revChar) -- + 1
set con to text 1 thru -x of theFile

Das "+1" da ein POSIX Pfad ja nicht bei "/" endet
Würde es sich um ein Finder Objekt handeln, so ginge es einfacher mit "container of item"

Gruß
 
Wenn du mit Posix-Pfaden hantierst (Unix-Notation mit Slashes) und nicht mit den Mac-typischen Pfaden (Doppelpunkt als Trennsymbol), dann hilft die Einbindung eines simples Shellbefehls.
Code:
set instring to "/Volumes/Murutzk Marah"
set outstring to do shell script "
    instring=\"" & instring & "\";
    instring=\"${instring%/}\";
    [ -d \"${instring}\" ]  &&
        echo \"${instring}\"  ||
        /usr/bin/dirname \"${instring}\"; "
 
Zuletzt bearbeitet:
dirname - so macht man das also richtig :•)

Danke
 
super, vielen dank.
ich verwende deine lösung, sedna, die klappt sehr gut.

einziges problem: sollte der pfad doch einmal ohne dateinamen und ohne letzten Slash auftauchen, wird durch dieses script auch der letzte ordner entfernt:
file:///Volumes/Templates
=>
file:///Volumes/

Kann ich dem noch irgendwie entgegenwirken?
 
Du könntest das auch mit sed versuchen:

Code:
[SIZE=2][B]set[/B] [COLOR=#3F7F00]instring[/COLOR] [B]to[/B] "/Volumes/Templates/file.ext
/Volumes/Templates/
/Volumes/Templates"
[B]set[/B] [COLOR=#3F7F00]outstring[/COLOR] [B]to[/B] [COLOR=#0016B0][B]do shell script[/B][/COLOR] "echo " & [COLOR=#6C04D4]quoted form[/COLOR] [B]of[/B] [COLOR=#3F7F00]instring[/COLOR] & " | sed 's/\\(.*\\/\\).*\\..*/\\1/g'"[/SIZE]

Wird zu:

Code:
"/Volumes/Templates/
/Volumes/Templates/
/Volumes/Templates"
 
Zuletzt bearbeitet:
danke, Phil, mit deiner Lösung klappt es.
Mit deiner bei mir leider nicht, Rastafari :/

Danke euch!

VG
 
Hab's kopiert, nicht abgeschrieben :)
Wenn ich dein Script bei mir ausführe, wird mir "/Volumes" ausgegeben, statt, wie gewünscht, /Volumes/Murutzk Marah.
Allerdings hilft auch das Anfügen eines / nichts ...
Wie dem auch sei, es klappt ja nun :)
 
Murutzk Marah

kann aber ein Ordner sein, an den einfach kein / gehangen wurde.
Ich möchte, dass es nur entfernt wird, wenn es tatsächlich eine Datei ist.

Man müsste bei deinem Script wahrscheinlich einfach vorher abfragen, ob ein ".ext" im String vorhanden ist, um sicherzustellen dass es ich um einen Ordner handelt.
 
Code:
set instring to "/Volumes/Murutzk Marah"
set outstring to do shell script "
    instring=\"" & instring & "\";
    instring=\"${instring%/}\";
    if  [ -f \"${instring}\" -o -h \"${instring}\" ];
    then
        /usr/bin/dirname \"${instring}\";
    elif  [ -d \"${instring}\" ];
    then
        echo \"${instring}\";
    else
        echo \"VOLL DER FEHLER\";
    fi; "
Die Prinzessin auf der Erbse, hm? :-)
Wenn die Datei (oder Link) nicht existiert, klappts übrigens trotzdem nicht.
Und nein, es gibt in diesem Fall *keine* Möglichkeit herauszufinden ob der Name nun eine Datei oder einen Ordner bezeichnen soll, ein Hellseherprogramm gibts nicht. Und ich kann dir auch nicht sagen was du dann sonst tun solltest, als zB sowas wie oben.
 
bin da nur so pingelig, weil ich nicht weiß, welchen Wert "instring" haben kann. der wert kommt von wo anders :)
leider gibt mir dein script aber immer "voll der fehler" aus ....
danke jedenfalls für die mühe.
 
Ich würde es halt einfach mal mit einem existierenden Objekt versuchen...
 
Hallo,
Code:
set somePath to path to desktop folder as string


set otherPath to POSIX file ((POSIX path of somePath) & "/..")

Viele Grüße
 
Oder so:
Code:
[B]set[/B] aFile [B]to[/B] [I]POSIX file[/I] ("/Users/fyysh/test.txt") [B]as[/B] [I]alias
[/I][B]tell[/B] [I]application[/I] "Finder" [B]to[/B] [B]set[/B] aFileContainer [B]to[/B] [I]container[/I] [B]of[/B] aFile [B]as[/B] [I]alias[/I]
[B]return[/B] (POSIX path [B]of[/B] aFileContainer)