Extract filename and extension in Bash

后端 未结 30 2014
野趣味
野趣味 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:20

    Magic file recognition

    In addition to the lot of good answers on this Stack Overflow question I would like to add:

    Under Linux and other unixen, there is a magic command named file, that do filetype detection by analysing some first bytes of file. This is a very old tool, initialy used for print servers (if not created for... I'm not sure about that).

    file myfile.txt
    myfile.txt: UTF-8 Unicode text
    
    file -b --mime-type myfile.txt
    text/plain
    

    Standards extensions could be found in /etc/mime.types (on my Debian GNU/Linux desktop. See man file and man mime.types. Perhaps you have to install the file utility and mime-support packages):

    grep $( file -b --mime-type myfile.txt ) 

    You could create a bash function for determining right extension. There is a little (not perfect) sample:

    file2ext() {
        local _mimetype=$(file -Lb --mime-type "$1") _line _basemimetype
        case ${_mimetype##*[/.-]} in
            gzip | bzip2 | xz | z )
                _mimetype=${_mimetype##*[/.-]}
                _mimetype=${_mimetype//ip}
                _basemimetype=$(file -zLb --mime-type "$1")
                ;;
            stream )
                _mimetype=($(file -Lb "$1"))
                [ "${_mimetype[1]}" = "compressed" ] &&
                    _basemimetype=$(file -b --mime-type - < <(
                            ${_mimetype,,} -d <"$1")) ||
                    _basemimetype=${_mimetype,,}
                _mimetype=${_mimetype,,}
                ;;
            executable )  _mimetype='' _basemimetype='' ;;
            dosexec )     _mimetype='' _basemimetype='exe' ;;
            shellscript ) _mimetype='' _basemimetype='sh' ;;
            * )
                _basemimetype=$_mimetype
                _mimetype=''
                ;;
        esac
        while read -a _line ;do
            if [ "$_line" == "$_basemimetype" ] ;then
                [ "$_line[1]" ] &&
                    _basemimetype=${_line[1]} ||
                    _basemimetype=${_basemimetype##*[/.-]}
                break
            fi
            done 

    This function could set a Bash variable that can be used later:

    (This is inspired from @Petesh right answer):

    filename=$(basename "$fullfile")
    filename="${filename%.*}"
    file2ext "$fullfile" extension
    
    echo "$fullfile -> $filename . $extension"
    

提交回复
热议问题