Am 10.10.2014 um 20:48 schrieb David Aguilar: > On Fri, Oct 10, 2014 at 01:19:40PM +0200, Jakub Narębski wrote: >> David Aguilar wrote: >>> Avoid filenames with multiple dots so that overly-picky tools do >>> not misinterpret their extension. >>> >>> Previously, foo/bar.ext in the worktree would result in e.g. >>> >>> ./foo/bar.ext.BASE.1234.ext >>> >>> This can be improved by having only a single .ext and using >>> underscore instead of dot so that the extension cannot be >>> misinterpreted. The resulting path becomes: >>> >>> ./foo/bar_BASE_1234.ext >>> >>> Suggested-by: Sergio Ferrero <sferrero@xxxxxxxxxxxxxx> >>> Helped-by: Junio C Hamano <gitster@xxxxxxxxx> >>> Signed-off-by: David Aguilar <davvid@xxxxxxxxx> >>> --- >> >>> + if BASE=$(expr "$MERGED" : '\(.*\)\.[^/]*$') >>> + then >>> + ext=$(expr "$MERGED" : '.*\(\.[^/]*\)$') >>> + else >>> + BASE=$MERGED >>> + ext= >>> + fi >> >> Why use expr and not POSIX shell parameter substitution? >> >> BASE=${MERGED%.*} >> ext=.${MERGED##*.} >> >> Or something like that... > > Thanks for the sug. > > My POSIX shell parameter expansion-fu is not super advanced, but > if you can help me rework it I'd be happy to reroll. > > It does seem simple and robust with expr, though. Extending the > parameter expansion approach to work in all cases may end up > with more complexity than with the expr method, it seems. > > Here are the use cases: > > $ MERGED=foo.bar.baz && echo ${MERGED%.*} ${MERGED##*.} > foo.bar baz > > Good. > > $ MERGED=foo && echo ${MERGED%.*} ${MERGED##*.} > foo foo > > Bad. > There's no extension and the substitution doesn't handle it. > > $ MERGED=foo.bar/baz && echo ${MERGED%.*} ${MERGED##*.} > foo bar/baz > > Bad. > There's no extension but the substitution thinks the parent directory's > extension-less name is the basename, and thinks that bar/baz is the extension. > > I am curious to know whether there's a nice and elegant way to do it > with shell expansions. Let me know what you think. It's not exactly elegant to do it: First, you extract the last path part: file=${MERGED##*/} Then the directory including the trailing slash: dir=${MERGED%"$file"} Then the basename without an extension: base=${file%.*} Finally the extension including the dot: ext=${file#"$base"} Beware of empty $base and $dir (e.g., for files named .gitignore or so) -- Hannes -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html