Extract filename and extension in Bash

后端 未结 30 1958
野趣味
野趣味 2020-11-21 05:29

I want to get the filename (without extension) and the extension separately.

The best solution I found so far is:

NAME=`echo \"$FILE\" | cut -d\'.\'          


        
30条回答
  •  温柔的废话
    2020-11-21 06:19

    Based largely off of @mklement0's excellent, and chock-full of random, useful bashisms - as well as other answers to this / other questions / "that darn internet"... I wrapped it all up in a little, slightly more comprehensible, reusable function for my (or your) .bash_profile that takes care of what (I consider) should be a more robust version of dirname/basename / what have you..

    function path { SAVEIFS=$IFS; IFS=""   # stash IFS for safe-keeping, etc.
        [[ $# != 2 ]] && echo "usage: path  " && return    # demand 2 arguments
        [[ $1 =~ ^(.*/)?(.+)?$ ]] && {     # regex parse the path
            dir=${BASH_REMATCH[1]}
            file=${BASH_REMATCH[2]}
            ext=$([[ $file = *.* ]] && printf %s ${file##*.} || printf '')
            # edge cases for extensionless files and files like ".nesh_profile.coffee"
            [[ $file == $ext ]] && fnr=$file && ext='' || fnr=${file:0:$((${#file}-${#ext}))}
            case "$2" in
                 dir) echo      "${dir%/*}"; ;;
                name) echo      "${fnr%.*}"; ;;
            fullname) echo "${fnr%.*}.$ext"; ;;
                 ext) echo           "$ext"; ;;
            esac
        }
        IFS=$SAVEIFS
    }     
    

    Usage examples...

    SOMEPATH=/path/to.some/.random\ file.gzip
    path $SOMEPATH dir        # /path/to.some
    path $SOMEPATH name       # .random file
    path $SOMEPATH ext        # gzip
    path $SOMEPATH fullname   # .random file.gzip                     
    path gobbledygook         # usage: -bash  
    

提交回复
热议问题