FAT32 Stick physikalisch sortieren

Code:
set device to do shell script "[[ $(mount | grep -c 'msdos') -eq 1 ]] && mount | grep 'msdos' | cut -d' ' -f1 || exit 0"
if device is "" then
    beep
    display alert "fatsort: must be 1 msdos device only."
else
    do shell script "diskutil unmountDisk " & device
    do shell script "/usr/local/bin/fatsort -n " & device with administrator privileges
    do shell script "diskutil mount " & device
end if

klappt natürlich nur, wenn nur eine fat32 volume da ist…

So schmeisst er bei msdos <> 1 einen Fehler.
 
Zuletzt bearbeitet:
sorry, hatte den letzten Beitrag nicht gesehen...
 
Zuletzt bearbeitet:
Danke, danke, danke! hat wunderbar geklappt - habe noch einzwei dialogboxen dazugebastelt sowie auch die Ausgabe der Befehle werden nun angezeigt.

Falls es jemand braucht:
Code:
[COLOR=#012FBE][FONT=Verdana][B]display dialog[/B][/FONT][/COLOR][FONT=Verdana] "Dieses Script sortiert einen USB-Stick oder eine SD-Karte alphabetisch." & [/FONT][COLOR=#812FDC][FONT=Verdana]return[/FONT][/COLOR][FONT=Verdana] & [/FONT][COLOR=#812FDC][FONT=Verdana]return[/FONT][/COLOR][FONT=Verdana] & "Voraussetzungen:" & [/FONT][COLOR=#812FDC][FONT=Verdana]return[/FONT][/COLOR][FONT=Verdana] & "- Es darf nur 1 mit MS-DOS formatiertes Gerät am Mac verbunden sein" & [/FONT][COLOR=#812FDC][FONT=Verdana]return[/FONT][/COLOR][FONT=Verdana] & "- fatsort muss in '/usr/bin/' [/FONT][FONT=Verdana]abgelegt sein" & [/FONT][COLOR=#812FDC][FONT=Verdana]return[/FONT][/COLOR][FONT=Verdana] & [/FONT][COLOR=#812FDC][FONT=Verdana]return[/FONT][/COLOR][FONT=Verdana] & "Wenn diese Bedingungen erfüllt sind, dann klicke auf OK." [/FONT][COLOR=#012FBE][FONT=Verdana]buttons[/FONT][/COLOR][FONT=Verdana] {"Abbruch", "OK"} [/FONT][COLOR=#012FBE][FONT=Verdana]default button[/FONT][/COLOR][FONT=Verdana] "OK"
[/FONT][FONT=Verdana][B]if[/B] [COLOR=#5730be]button returned[/COLOR] [B]of[/B] [COLOR=#812fdc]result[/COLOR] [B]is[/B] "Abbruch" [B]then[/B][/FONT]
[FONT=Verdana]   [COLOR=#012fbe][B]display alert[/B][/COLOR] "Skript wurde vom Benutzer abgebrochen!"[/FONT]
[FONT=Verdana][B]end[/B] [B]if[/B][/FONT][FONT=Verdana]
[/FONT][FONT=Verdana][B]set[/B] [COLOR=#4f8f00]x[/COLOR] [B]to[/B] [COLOR=#012fbe][B]do shell script[/B][/COLOR] "mount"[/FONT]
[FONT=Verdana][B]set[/B] [COLOR=#4f8f00]y[/COLOR] [B]to[/B] ("Folgende Laufwerke wurde erkannt:" & [COLOR=#812fdc]return[/COLOR] & [COLOR=#812fdc]return[/COLOR] & "" & [COLOR=#4f8f00]x[/COLOR] [B]as[/B] [COLOR=#0433ff][I]string[/I][/COLOR]) & [COLOR=#812fdc]return[/COLOR] & [COLOR=#812fdc]return[/COLOR] & "Prüfe, ob das gewünschte Laufwerk angezeigt wird und ob es als 'msdos' deklariert ist. Falls dem nicht so ist, klicke auf 'Abbruch'."[/FONT]
[COLOR=#012FBE][FONT=Verdana][B]display dialog [/B][COLOR=#4f8f00]y[/COLOR][/FONT][/COLOR]
[FONT=Verdana][B]if[/B] [COLOR=#5730be]button returned[/COLOR] [B]of[/B] [COLOR=#812fdc]result[/COLOR] [B]is[/B] "Abbruch" [B]then[/B][/FONT]
[FONT=Verdana]    [COLOR=#012fbe][B]display alert[/B][/COLOR] "Skript wurde vom Benutzer abgebrochen!"[/FONT]
[FONT=Verdana][B]end[/B] [B]if[/B][/FONT]
[B]set[/B][COLOR=#4f8f00][FONT=Verdana]device[/FONT][/COLOR][B]to[/B][COLOR=#012fbe][FONT=Verdana][B]do shell script[/B][/FONT][/COLOR][FONT=Verdana] "[[ $(mount | grep -c 'msdos') -eq 1 ]] && mount | grep 'msdos' | cut -d' ' -f1 || exit 0"[/FONT]
[FONT=Verdana][B]if[/B] [COLOR=#4f8f00]device[/COLOR] [B]is[/B] "" [B]then[/B][/FONT]
[FONT=Verdana]    [COLOR=#012fbe][B]display alert[/B][/COLOR] "fatsort: Es darf nur ein MS-DOS Lauferk vorhanden sein (aktuell sind mehr als ein solches Laufwerk gemountet (oder gar keines)!"[/FONT]
[FONT=Verdana][B]else[/B][/FONT]
[FONT=Verdana]    [B]set[/B] [COLOR=#4f8f00]x[/COLOR] [B]to[/B] [COLOR=#012fbe][B]do shell script[/B][/COLOR] "diskutil unmountDisk " & [COLOR=#4f8f00]device[/COLOR][/FONT]
[FONT=Verdana]    [B]set[/B] [COLOR=#4f8f00]y[/COLOR] [B]to[/B] [COLOR=#012fbe][B]do shell script[/B][/COLOR] "/usr/bin/fatsort " & [COLOR=#4f8f00]device[/COLOR] [COLOR=#5730be]password[/COLOR] "xxxxxxxxxx" [COLOR=#5730be]user name[/COLOR] "xxxxx" [B]with[/B] [COLOR=#012fbe]administrator privileges[/COLOR][/FONT]
[FONT=Verdana]    [B]set[/B] [COLOR=#4f8f00]z[/COLOR] [B]to[/B] [COLOR=#012fbe][B]do shell script[/B][/COLOR] "diskutil mount " & [COLOR=#4f8f00]device[/COLOR][/FONT]
[FONT=Verdana]    [COLOR=#012fbe][B]display dialog[/B][/COLOR] [COLOR=#4f8f00]x[/COLOR] & [COLOR=#4f8f00]y[/COLOR] & [COLOR=#4f8f00]z[/COLOR] & [COLOR=#812fdc]return[/COLOR] & [COLOR=#812fdc]return[/COLOR] & "    Fertig :-)" & [COLOR=#812fdc]return[/COLOR] & "Vergiss nicht, das gewünschte Laufwerk noch auszuwerfen!" [COLOR=#012fbe]buttons[/COLOR] "OK" [COLOR=#012fbe]default button[/COLOR] "OK"[/FONT]
[FONT=Verdana][B]end[/B] [B]if[/B][/FONT]
die "xxxx" bei password und user name muss man natürlich ergänzen

Kann man sicher noch eleganter lösen, aber es funktioniert so ganz gut.
Danke für eure Mithilfe an dem Script!
 
man könnte das script auch einfach umändern zu einem droplet, wo man die volume drauf dropt…
 
Hmm, das wäre natürlich ganz was Feines, das spart dann auch das Problem, OB eine msdos-Disk gemountet ist, da ich es ja sonst nicht rüberziehen könnte.

Habe so ein Droplet aber noch nie gemacht...
Das Droplet selbst bekommt dann wohl das Volume (oder das /dev/disk) frei Haus geliefert nach dem Drag&Drop, damit kann man dann einfach im Skript weiterarbeiten.
Sehe ich das richtig? Wenn ja, muss ich mich da mal genauer einlesen - das klingt sehr interessant!
 
ist auch nicht so schwer:
Code:
on open DropList
	repeat with objectRef in DropList
		set type to do shell script "diskutil info " & POSIX path of objectRef & "|grep 'Type (Bun'|awk '{print $3}'"
		if type = "msdos" then
			set device to do shell script "diskutil info " & POSIX path of objectRef & "|grep 'Device Node'|awk '{print $3}'"
			do shell script "diskutil unmount " & device
			do shell script "/usr/local/bin/fatsort -n " & device with administrator privileges
			do shell script "diskutil mount " & device
		end if
	end repeat
end open
 
Super, danke dir!

Das ist ja genial, was einem so Droplets an Möglichkeiten bieten bzw. Dinge vereinfachen!
 
@oneO

Kann ich mal einen kompletten Output von "diskutil info »msdos-device«" haben, weil dein grep erst ab 10.8 (7?) funktioniert?
 
hab eben mal 10.6 und 10.9 verglichen,
bei 10.6 ist es Type: bei 10.9 Type (Bundle):

vielleicht ist es besser, einfach direkt nach msdos zu greppen?

Code:
		set type to do shell script "diskutil info " & POSIX path of objectRef & "|grep -c msdos;exit 0"
		if type = "1" then
 
Code:
on open DropList
    repeat with objectRef in DropList
        set type to do shell script "diskutil info " & POSIX path of objectRef & "|grep -o 'msdos'"
        if type = "msdos" then
            set device to do shell script "diskutil info " & POSIX path of objectRef & "|grep 'Device Node'|awk '{print $3}'"
            do shell script "diskutil unmount " & device
            do shell script "/usr/local/bin/fatsort -n " & device with administrator privileges
            do shell script "diskutil mount " & device
        end if
    end repeat
end open

Hab's angepasst.
 
d.h. mit 10.9 soll ich lieber die geänderte Varianten nehmen?
 
Den device identifier bekommt man auch sehr gut über mount:

set device to do shell script "mount | grep " & name of (info for objectRef) & ".*msdos | awk '{print $1}'"
 
ah, ok. Danke.
 
Code:
on open DropList
    repeat with objectRef in DropList
        set diskinfo to quoted form of (do shell script "diskutil info " & POSIX path of objectRef)
        --display dialog diskinfo
        if "msdos" is in diskinfo then
            set device to do shell script "echo " & diskinfo & " | awk '{print $6}'"
            --display dialog diskinfo & return & device
            do shell script ":" with administrator privileges
            do shell script "diskutil unmount " & device
            do shell script "/usr/local/bin/fatsort -n " & device with administrator privileges
            do shell script "diskutil mount " & device
        else
            beep
            display alert "Error:" & return & return & objectRef & " is not a msdos device."
        end if
    end repeat
end open

Das dürfte die wartungsfreundlichste Variante sein.
diskutil wird nur einmal aufgerufen und Änderungen betrifft wahrscheinlich nur die $6 im awk.
Leicht zu prüfen, durch auskommentieren der »display dialogs«.
Admin Creds werden vor dem unmounten abgefragt.
 
Muss hier nochmal einhaken, da das Droplet nicht mehr läuft...

Hier der Code:
Code:
on open DropList
    repeat with objectRef in DropList
        set type to do shell script "diskutil info " & POSIX path of objectRef & "|grep 'Type (Bun'|awk '{print $3}'"
        if type = "msdos" then
            set device to do shell script "diskutil info " & POSIX path of objectRef & "|grep 'Device Node'|awk '{print $3}'"
            set x to do shell script "diskutil unmount " & device with administrator privileges
            set y to do shell script "/Users/Peter/fatsort -n " & device with administrator privileges
            set z to do shell script "diskutil mount " & device
            display dialog x & return & return & y & return & return & z & return & return & "Fertig :-)" & return & "Vergiss nicht, das gewünschte Laufwerk noch auszuwerfen!" buttons "OK" default button "OK"
        end if
    end repeat
end open
Wenn ich den Stick auf das Droplet ziehe, dann wird zuerst nach dem Admin gefragt (soll ja so sein) und danach kommt dann so eine Meldung:
Bild 2019-12-17 um 12.03.55.png

Ich vermute da nicht so sehr das Skript, sondern eher die Rechte der fatsort-Datei - wobei "everyone" "nur Lesen"-Rechte hat, mehr braucht man da ja nicht.
Kann aber bei dieser Datei nicht mal als Admin irgendwelche Rechte ändern oder Userrechte hinzufügen etc.

Kann das an der Berechtigungen liegen oder hat sich mit Catalina etwas an den Berechtigungen für die Volumes etwas getan? Ev. weil ja das Startlaufwerk nicht mehr frei zugänglich ist oder sonst etwas - wobei diskutil ja problemlos noch klappt und er nur beim fatsort rumzickt.

Oder gibts wo ein Tool, wo ich einen FAT-Stick sortieren kann, also ein fertiges? Bin wohl der einzige, der das noch braucht...

Danke für eure Hilfe!
 
Kann das an der Berechtigungen liegen oder hat sich mit Catalina etwas an den Berechtigungen für die Volumes etwas getan? Ev. weil ja das Startlaufwerk nicht mehr frei zugänglich ist oder sonst etwas - wobei diskutil ja problemlos noch klappt und er nur beim fatsort rumzickt.

entweder braucht das script oder fatsort halt fulldiskaccess oder andere rechte in sicherheit/datenschutz.
 
  • Gefällt mir
Reaktionen: dg2rbf
Danke für den Tipp, habe nun beide hinzugefügt bei den Datenschutzeinstellungen-Festplattenvollzugriff, aber es kommt die gleiche Fehlermeldung.
*edit* auch bei "Entwickler-Werkzeuge" die gleiche Meldung

Habe vorhin wo gelesen, dass man mit "touch" (-m und/oder -a) das Änderungsdatum neu setzen kann - könnte man da nicht via applescript die Dateien bzw. Ordner rekursiv laden und der Reihe nach touch-en, damit der FAT-Stick richtig sortiert ist?
 
Versuch mal:
Code:
--on open DropList
set DropList to choose folder multiple selections allowed yes
repeat with objectRef in DropList
    set type to do shell script "diskutil info " & POSIX path of objectRef & "|grep 'Type (Bun'|awk '{print $3}'"
    if type = "msdos" then
        set device to do shell script "diskutil info " & POSIX path of objectRef & "|grep 'Device Node'|awk '{print $3}'"
        set x to do shell script "diskutil unmount " & device with administrator privileges
        set y to do shell script "/Users/Peter/fatsort -n " & device with administrator privileges
        set z to do shell script "diskutil mount " & device
        display dialog x & return & return & y & return & return & z & return & return & "Fertig :-)" & return & "Vergiss nicht, das gewünschte Laufwerk noch auszuwerfen!" buttons "OK" default button "OK"
    end if
end repeat
end open
So siehst Du in welcher Zeile der Fehler auftritt.
PS: Scheint als ob fatsort nicht genügend Zugriffsrechte hat.
 
@Atalantia mit der ersten Zeile auskommentiert tut er gar nichts, wenn ich die einkommentiere, dann wähle ich den Stick und es kommt wieder die Meldung - ohne Zeilennummer etc.

Oder habe ich da was missverstanden?

*edit*
auch via Editor gestartet kommt die gleiche Meldung in einem optisch minimal anderen Fenster.

*edit*2
ah, unten
error "sort_fs: Operation not permitted!
main: Failed to sort file system!" number 255
 
Zurück
Oben Unten