You've got one 'thru too much.
red>> parse %abc/file.ext [collect[keep [some [thru #"/"] | keep (none) ] keep to end]]
== [%abc/ %file.ext]
red>> parse %/abc/file.ext [collect[keep [some [thru #"/"] | keep (none) ] keep to end]]
== [%/abc/ %file.ext]
red>> parse %/abc/def/file.ext [collect[keep [some [thru #"/"] | keep (none) ] keep to end]]
== [%/abc/def/ %file.ext]
I am using 'some, so that the rule fails, if there's no slash in the input. Then using "| keep (none)" keeps the 'none you want.
"keep (something)" keeps the return value of running "something" through the 'do dialect.
red>> parse %file.ext [collect[keep [some [thru #"/"] | keep (none) ] keep to end]]
== [none %file.ext]
Without it, you would only get the file part.
red>> parse %file.ext [collect[keep [any [thru #"/"]] keep to end]]
== [%file.ext]
red>> parse %/abc/def/file.ext [collect[keep [any [thru #"/"]] keep to end]]
== [%/abc/def/ %file.ext]