2491

ファイル名(拡張子なし)と拡張子を別々に取得したい。

これまでに見つけた最良の解決策は次のとおりです。

NAME=`echo "$FILE" | cut -d'.' -f1`
EXTENSION=`echo "$FILE" | cut -d'.' -f2`

.ファイル名に複数の文字が含まれていると機能しないため、これは間違っています。たとえば、私が を持っている場合、andの代わりにanda.b.jsを考慮します。ab.jsa.bjs

Pythonで簡単に実行できます

file, ext = os.path.splitext(path)

しかし、可能であれば、これのためだけに Python インタープリターを起動したくありません。

より良いアイデアはありますか?

4

38 に答える 38

543

通常、拡張機能は既に知っているので、次を使用することをお勧めします。

basename filename .extension

例えば:

basename /path/to/dir/filename.txt .txt

そして、私たちは得る

filename
于 2011-10-19T10:56:09.373 に答える
181

POSIX パラメータ展開の魔法を使用できます。

bash-3.2$ FILENAME=somefile.tar.gz
bash-3.2$ echo "${FILENAME%%.*}"
somefile
bash-3.2$ echo "${FILENAME%.*}"
somefile.tar

ファイル名が の形式である場合、 に最も長く一致するものを貪欲に削除し、空の文字列になるという警告が./somefile.tar.gzありecho ${FILENAME%%.*}ます.

(一時変数を使用してこれを回避できます。

FULL_FILENAME=$FILENAME
FILENAME=${FULL_FILENAME##*/}
echo ${FILENAME%%.*}

)


こちらのサイトが詳しく説明しています。

${variable%pattern}
  Trim the shortest match from the end
${variable##pattern}
  Trim the longest match from the beginning
${variable%%pattern}
  Trim the longest match from the end
${variable#pattern}
  Trim the shortest match from the beginning
于 2013-02-05T09:09:58.277 に答える
87

ファイルに拡張子がないか、ファイル名がない場合、それは機能しないようです。これが私が使用しているものです。ビルトインのみを使用し、より多くの (すべてではない) 異常なファイル名を処理します。

#!/bin/bash
for fullpath in "$@"
do
    filename="${fullpath##*/}"                      # Strip longest match of */ from start
    dir="${fullpath:0:${#fullpath} - ${#filename}}" # Substring from 0 thru pos of filename
    base="${filename%.[^.]*}"                       # Strip shortest match of . plus at least one non-dot char from end
    ext="${filename:${#base} + 1}"                  # Substring from len of base thru end
    if [[ -z "$base" && -n "$ext" ]]; then          # If we have an extension and no base, it's really the base
        base=".$ext"
        ext=""
    fi

    echo -e "$fullpath:\n\tdir  = \"$dir\"\n\tbase = \"$base\"\n\text  = \"$ext\""
done

そして、ここにいくつかのテストケースがあります:

$ basename-and-extension.sh / /home/me/ /home/me/file /home/me/file.tar /home/me/file.tar.gz /home/me/.hidden /home/me/ .hidden.tar /home/me/.. .
/:
    dir = "/"
    ベース = ""
    ext = ""
/ホーム/私/:
    dir = "/ホーム/私/"
    ベース = ""
    ext = ""
/ホーム/私/ファイル:
    dir = "/ホーム/私/"
    ベース =「ファイル」
    ext = ""
/home/me/file.tar:
    dir = "/ホーム/私/"
    ベース =「ファイル」
    ext = "タール"
/home/me/file.tar.gz:
    dir = "/ホーム/私/"
    ベース = "file.tar"
    ext = "gz"
/home/me/.hidden:
    dir = "/ホーム/私/"
    ベース = ".hidden"
    ext = ""
/home/me/.hidden.tar:
    dir = "/ホーム/私/"
    ベース = ".hidden"
    ext = "タール"
/ホーム/私/..:
    dir = "/ホーム/私/"
    ベース = ".."
    ext = ""
.:
    dir = ""
    ベース = "."
    ext = ""
于 2009-09-10T05:17:16.777 に答える
50

使用できますbasename

例:

$ basename foo-bar.tar.gz .tar.gz
foo-bar

削除する拡張機能を basename に指定する必要がありますが、常に実行tarしている-z場合は、拡張機能が.tar.gz.

これはあなたが望むことをするはずです:

tar -zxvf $1
cd $(basename $1 .tar.gz)
于 2013-02-05T08:50:17.440 に答える
41

メレンはブログ投稿のコメントに次のように書いています。

Bash を使用${file%.*}して、拡張子なしでファイル名を取得する方法と${file##*.}、拡張子のみを取得する方法もあります。あれは、

file="thisfile.txt"
echo "filename: ${file%.*}"
echo "extension: ${file##*.}"

出力:

filename: thisfile
extension: txt
于 2010-07-21T10:24:37.820 に答える
32

この単純なタスクを気にする必要はありませんawk。パラメータ展開のみを使用する、純粋な Bash と互換性のあるソリューションがあります。sedperlos.path.splitext()

参照実装

のドキュメントos.path.splitext(path):

、およびextが空であるか、ピリオドで始まり、最大 1 つのピリオドを含む(root, ext)ように、パス名 path をペアに分割します。ベース名の先頭のピリオドは無視されます。戻ります。root + ext == pathsplitext('.cshrc')('.cshrc', '')

Python コード:

root, ext = os.path.splitext(path)

バッシュの実装

主要なピリオドを尊重する

root="${path%.*}"
ext="${path#"$root"}"

先頭のピリオドを無視する

root="${path#.}";root="${path%"$root"}${root%.*}"
ext="${path#"$root"}"

テスト

以下は、先行期間を無視する実装のテスト ケースです。これは、すべての入力で Python リファレンス実装と一致する必要があります。

|---------------|-----------|-------|
|path           |root       |ext    |
|---------------|-----------|-------|
|' .txt'        |' '        |'.txt' |
|' .txt.txt'    |' .txt'    |'.txt' |
|' txt'         |' txt'     |''     |
|'*.txt.txt'    |'*.txt'    |'.txt' |
|'.cshrc'       |'.cshrc'   |''     |
|'.txt'         |'.txt'     |''     |
|'?.txt.txt'    |'?.txt'    |'.txt' |
|'\n.txt.txt'   |'\n.txt'   |'.txt' |
|'\t.txt.txt'   |'\t.txt'   |'.txt' |
|'a b.txt.txt'  |'a b.txt'  |'.txt' |
|'a*b.txt.txt'  |'a*b.txt'  |'.txt' |
|'a?b.txt.txt'  |'a?b.txt'  |'.txt' |
|'a\nb.txt.txt' |'a\nb.txt' |'.txt' |
|'a\tb.txt.txt' |'a\tb.txt' |'.txt' |
|'txt'          |'txt'      |''     |
|'txt.pdf'      |'txt'      |'.pdf' |
|'txt.tar.gz'   |'txt.tar'  |'.gz'  |
|'txt.txt'      |'txt'      |'.txt' |
|---------------|-----------|-------|

試験結果

すべてのテストに合格しました。

于 2016-12-02T09:04:43.557 に答える
27

コマンドを使用しcutて、最後の 2 つの拡張子 (".tar.gz"部分)を削除できます。

$ echo "foo.tar.gz" | cut -d'.' --complement -f2-
foo

コメントで Clayton Hughes が指摘したように、これは質問の実際の例では機能しません。したがって、代替手段として、次のsedように拡張正規表現を使用することを提案します。

$ echo "mpc-1.0.1.tar.gz" | sed -r 's/\.[[:alnum:]]+\.[[:alnum:]]+$//'
mpc-1.0.1

最後の 2 つの拡張子 (英数字) を無条件に削除することで機能します。

[Anders Lindahl からのコメントを受けて再度更新]

于 2013-02-05T08:53:11.740 に答える
25

受け入れられた答えは、典型的なケースではうまく機能しますが、エッジケースでは失敗します。

  • 拡張子のないファイル名 (この回答の残りの部分では接尾辞extension=${filename##*.}と呼ばれます)の場合、空の文字列ではなく入力ファイル名を返します。
  • extension=${filename##*.}.慣例に反して 、最初の は含まれません。
    • やみくもに先頭に追加.しても、接尾辞のないファイル名では機能しません。
  • filename="${filename%.*}".入力ファイル名が で始まり、それ以上の文字が含まれていない場合.(例: )は空文字列になります.bash_profile- 規則に反します。

----------

したがって、すべてのエッジ ケースをカバーする堅牢なソリューションの複雑さは、関数を必要とします。以下の定義を参照してください。パスのすべてのコンポーネントを返すことができます。

呼び出しの例:

splitPath '/etc/bash.bashrc' dir fname fnameroot suffix
# -> $dir == '/etc'
# -> $fname == 'bash.bashrc'
# -> $fnameroot == 'bash'
# -> $suffix == '.bashrc'

入力パスの後の引数は、位置変数で自由に選択できることに注意してください。
重要な変数の前にある重要でない変数をスキップするには、_(使い捨て変数を使用する$_) または'';を指定します。たとえば、ファイル名のルートと拡張子のみを抽出するには、splitPath '/etc/bash.bashrc' _ _ fnameroot extension.


# SYNOPSIS
#   splitPath path varDirname [varBasename [varBasenameRoot [varSuffix]]] 
# DESCRIPTION
#   Splits the specified input path into its components and returns them by assigning
#   them to variables with the specified *names*.
#   Specify '' or throw-away variable _ to skip earlier variables, if necessary.
#   The filename suffix, if any, always starts with '.' - only the *last*
#   '.'-prefixed token is reported as the suffix.
#   As with `dirname`, varDirname will report '.' (current dir) for input paths
#   that are mere filenames, and '/' for the root dir.
#   As with `dirname` and `basename`, a trailing '/' in the input path is ignored.
#   A '.' as the very first char. of a filename is NOT considered the beginning
#   of a filename suffix.
# EXAMPLE
#   splitPath '/home/jdoe/readme.txt' parentpath fname fnameroot suffix
#   echo "$parentpath" # -> '/home/jdoe'
#   echo "$fname" # -> 'readme.txt'
#   echo "$fnameroot" # -> 'readme'
#   echo "$suffix" # -> '.txt'
#   ---
#   splitPath '/home/jdoe/readme.txt' _ _ fnameroot
#   echo "$fnameroot" # -> 'readme'  
splitPath() {
  local _sp_dirname= _sp_basename= _sp_basename_root= _sp_suffix=
    # simple argument validation
  (( $# >= 2 )) || { echo "$FUNCNAME: ERROR: Specify an input path and at least 1 output variable name." >&2; exit 2; }
    # extract dirname (parent path) and basename (filename)
  _sp_dirname=$(dirname "$1")
  _sp_basename=$(basename "$1")
    # determine suffix, if any
  _sp_suffix=$([[ $_sp_basename = *.* ]] && printf %s ".${_sp_basename##*.}" || printf '')
    # determine basename root (filemane w/o suffix)
  if [[ "$_sp_basename" == "$_sp_suffix" ]]; then # does filename start with '.'?
      _sp_basename_root=$_sp_basename
      _sp_suffix=''
  else # strip suffix from filename
    _sp_basename_root=${_sp_basename%$_sp_suffix}
  fi
  # assign to output vars.
  [[ -n $2 ]] && printf -v "$2" "$_sp_dirname"
  [[ -n $3 ]] && printf -v "$3" "$_sp_basename"
  [[ -n $4 ]] && printf -v "$4" "$_sp_basename_root"
  [[ -n $5 ]] && printf -v "$5" "$_sp_suffix"
  return 0
}

test_paths=(
  '/etc/bash.bashrc'
  '/usr/bin/grep'
  '/Users/jdoe/.bash_profile'
  '/Library/Application Support/'
  'readme.new.txt'
)

for p in "${test_paths[@]}"; do
  echo ----- "$p"
  parentpath= fname= fnameroot= suffix=
  splitPath "$p" parentpath fname fnameroot suffix
  for n in parentpath fname fnameroot suffix; do
    echo "$n=${!n}"
  done
done

関数を実行するテスト コード:

test_paths=(
  '/etc/bash.bashrc'
  '/usr/bin/grep'
  '/Users/jdoe/.bash_profile'
  '/Library/Application Support/'
  'readme.new.txt'
)

for p in "${test_paths[@]}"; do
  echo ----- "$p"
  parentpath= fname= fnameroot= suffix=
  splitPath "$p" parentpath fname fnameroot suffix
  for n in parentpath fname fnameroot suffix; do
    echo "$n=${!n}"
  done
done

予想される出力 - エッジ ケースに注意してください。

  • サフィックスのないファイル名
  • .(サフィックスの開始とは見なされません)で始まるファイル名
  • で終わる入力パス/(末尾/は無視されます)
  • ファイル名のみの入力パス (.親パスとして返されます)
  • 複数のプレフィックス トークンを持つファイル名.(最後のトークンのみがサフィックスと見なされます):
----- /etc/bash.bashrc
parentpath=/etc
fname=bash.bashrc
fnameroot=bash
suffix=.bashrc
----- /usr/bin/grep
parentpath=/usr/bin
fname=grep
fnameroot=grep
suffix=
----- /Users/jdoe/.bash_profile
parentpath=/Users/jdoe
fname=.bash_profile
fnameroot=.bash_profile
suffix=
----- /Library/Application Support/
parentpath=/Library
fname=Application Support
fnameroot=Application Support
suffix=
----- readme.new.txt
parentpath=.
fname=readme.new.txt
fnameroot=readme.new
suffix=.txt
于 2013-08-09T03:45:30.657 に答える
22

最小かつ最も単純なソリューション (1 行) は次のとおりです。

$ file=/blaabla/bla/blah/foo.txt
echo $(basename ${file%.*}) # foo
于 2017-04-22T14:39:16.063 に答える
18

ファイルの名前だけが必要な場合は、これを試すことができると思います:

FULLPATH=/usr/share/X11/xorg.conf.d/50-synaptics.conf

# Remove all the prefix until the "/" character
FILENAME=${FULLPATH##*/}

# Remove all the prefix until the "." character
FILEEXTENSION=${FILENAME##*.}

# Remove a suffix, in our case, the filename. This will return the name of the directory that contains this file.
BASEDIRECTORY=${FULLPATH%$FILENAME}

echo "path = $FULLPATH"
echo "file name = $FILENAME"
echo "file extension = $FILEEXTENSION"
echo "base directory = $BASEDIRECTORY"

そして、それがすべて =D です。

于 2011-09-29T07:26:47.640 に答える
13

-すべてのフィールドとそれに続くフィールドをフィールド番号に追加して表示するように強制的に切り取ることができます。

NAME=`basename "$FILE"`
EXTENSION=`echo "$NAME" | cut -d'.' -f2-`

したがって、FILE がeth0.pcap.gzの場合、EXTENSION は次のようになります。pcap.gz

同じロジックを使用して、次のようにカットで「-」を使用してファイル名を取得することもできます。

NAME=`basename "$FILE" | cut -d'.' -f-1`

これは、拡張子のないファイル名でも機能します。

于 2012-09-10T13:46:00.813 に答える
10

マジックファイル認識

このスタックオーバーフローの質問に対する多くの良い回答に加えて、追加したいと思います:

Linux やその他の unixen では、ファイルの最初のバイトを分析してファイルタイプを検出する、という名前の魔法のコマンドがあります。fileこれは非常に古いツールで、最初はプリント サーバー用に使用されていました (作成されていない場合は、それについてはわかりません)。

file myfile.txt
myfile.txt: UTF-8 Unicode text

file -b --mime-type myfile.txt
text/plain

標準拡張機能は次の場所にあります/etc/mime.types(私のDebian GNU/Linux デスクトップでは。 および を参照man fileしてくださいman mime.types。おそらく、fileユーティリティとmime-supportパッケージをインストールする必要があります)。

grep $( file -b --mime-type myfile.txt ) </etc/mime.types
text/plain      asc txt text pot brf srt

正しい拡張子を決定するための関数を作成できます。少し(完全ではない)サンプルがあります:

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 </etc/mime.types
    case ${_basemimetype##*[/.-]} in
        executable ) _basemimetype='' ;;
        shellscript ) _basemimetype='sh' ;;
        dosexec ) _basemimetype='exe' ;;
        * ) ;;
    esac
    [ "$_mimetype" ] && [ "$_basemimetype" != "$_mimetype" ] &&
      printf ${2+-v} $2 "%s.%s" ${_basemimetype##*[/.-]} ${_mimetype##*[/.-]} ||
      printf ${2+-v} $2 "%s" ${_basemimetype##*[/.-]}
}

この関数は、後で使用できる Bash 変数を設定できます。

(これは@Peteshの正しい答えからインスピレーションを得ています):

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

echo "$fullfile -> $filename . $extension"
于 2013-07-07T15:47:25.763 に答える
9
$ F = "text file.test.txt"  
$ echo ${F/*./}  
txt  

これは、ファイル名内の複数のドットとスペースに対応しますが、拡張子がない場合はファイル名自体を返します。ただし、簡単に確認できます。ファイル名と拡張子が同じであることをテストするだけです。

当然、この方法は .tar.gz ファイルでは機能しません。ただし、これは 2 段階のプロセスで処理できます。拡張子が gz の場合は、tar 拡張子もあるかどうかを再度確認します。

于 2011-04-10T13:58:28.480 に答える
9

わかりましたので、正しく理解できれば、ここでの問題は、複数の拡張子を持つファイルの名前と完全な拡張子を取得する方法ですstuff.tar.gz

これは私のために働く:

fullfile="stuff.tar.gz"
fileExt=${fullfile#*.}
fileName=${fullfile%*.$fileExt}

これによりstuff、ファイル名と.tar.gz拡張子が表示されます。0を含む任意の数の拡張機能で機能します。これが同じ問題を抱えている人の助けになることを願っています =)

于 2011-12-09T19:27:02.373 に答える
8

単に使用する${parameter%word}

あなたの場合:

${FILE%.*}

テストしたい場合は、次のすべてが機能し、拡張機能を削除するだけです。

FILE=abc.xyz; echo ${FILE%.*};
FILE=123.abc.xyz; echo ${FILE%.*};
FILE=abc; echo ${FILE%.*};
于 2010-07-12T12:44:04.007 に答える
6

これはAWKを使用したコードです。もっと簡単にできます。でもAWKは苦手です。

filename$ ls
abc.a.txt  a.b.c.txt  pp-kk.txt
filename$ find . -type f | awk -F/ '{print $2}' | rev | awk -F"." '{$1="";print}' | rev | awk 'gsub(" ",".") ,sub(".$", "")'
abc.a
a.b.c
pp-kk
filename$ find . -type f | awk -F/ '{print $2}' | awk -F"." '{print $NF}'
txt
txt
txt
于 2011-11-21T10:35:44.203 に答える
6

これは私のために働いた唯一のものです:

path='folder/other_folder/file.js'

base=${path##*/}
echo ${base%.*}

>> file

これは文字列補間でも使用できますが、残念ながらbase事前に設定する必要があります。

于 2019-06-08T07:42:26.510 に答える
4

簡単な答え:

POSIX 変数answerを拡張するには、さらに興味深いパターンを実行できることに注意してください。したがって、ここで説明するケースでは、次のように簡単に実行できます。

tar -zxvf $1
cd ${1%.tar.*}

これにより、最後に出現した .tar が切り取られます。<何か> .

より一般的には、最後に出現した . <何か> . <something-else>その後

${1.*.*}

正常に動作するはずです。

上記の回答のリンクは死んでいるようです。TLDP から、Bash で直接実行できる一連の文字列操作の優れた説明を次に示します。

于 2014-06-09T21:18:42.690 に答える
3

IMHO の最良の解決策は既に (シェル パラメータの拡張を使用して) 与えられており、現時点で最も評価の高いものです。

ただし、ダムコマンドを使用するだけのこれを追加します。これは効率的ではなく、真剣に使用する必要はありません。

FILENAME=$(echo $FILE | cut -d . -f 1-$(printf $FILE | tr . '\n' | wc -l))
EXTENSION=$(echo $FILE | tr . '\n' | tail -1)

楽しみのために追加しました:-)

于 2018-12-11T02:16:21.367 に答える
2

以下は、名前の大文字と小文字が競合する場合に名前を一意にする Bash スクリプトを作成したときに、ファイルの名前と拡張子を見つけるために使用したアルゴリズムです。

#! /bin/bash 

#
# Finds 
# -- name and extension pairs
# -- null extension when there isn't an extension.
# -- Finds name of a hidden file without an extension
# 

declare -a fileNames=(
  '.Montreal' 
  '.Rome.txt' 
  'Loundon.txt' 
  'Paris' 
  'San Diego.txt'
  'San Francisco' 
  )

echo "Script ${0} finding name and extension pairs."
echo 

for theFileName in "${fileNames[@]}"
do
     echo "theFileName=${theFileName}"  

     # Get the proposed name by chopping off the extension
     name="${theFileName%.*}"

     # get extension.  Set to null when there isn't an extension
     # Thanks to mklement0 in a comment above.
     extension=$([[ "$theFileName" == *.* ]] && echo ".${theFileName##*.}" || echo '')

     # a hidden file without extenson?
     if [ "${theFileName}" = "${extension}" ] ; then
         # hidden file without extension.  Fixup.
         name=${theFileName}
         extension=""
     fi

     echo "  name=${name}"
     echo "  extension=${extension}"
done 

テスト実行。

$ config/Name\&Extension.bash 
Script config/Name&Extension.bash finding name and extension pairs.

theFileName=.Montreal
  name=.Montreal
  extension=
theFileName=.Rome.txt
  name=.Rome
  extension=.txt
theFileName=Loundon.txt
  name=Loundon
  extension=.txt
theFileName=Paris
  name=Paris
  extension=
theFileName=San Diego.txt
  name=San Diego
  extension=.txt
theFileName=San Francisco
  name=San Francisco
  extension=
$ 

参考までに: 完全な音訳プログラムとその他のテスト ケースは、 https ://www.dropbox.com/s/4c6m0f2e28a1vxf/avoid-clashes-code.zip?dl=0 にあります。

于 2014-10-21T21:47:43.170 に答える
1

サンプル ファイル を使用する/Users/Jonathan/Scripts/bash/MyScript.shと、このコードは次のようになります。

MY_EXT=".${0##*.}"
ME=$(/usr/bin/basename "${0}" "${MY_EXT}")

${ME}beingMyScript${MY_EXT}being になり.shます:


脚本:

#!/bin/bash
set -e

MY_EXT=".${0##*.}"
ME=$(/usr/bin/basename "${0}" "${MY_EXT}")

echo "${ME} - ${MY_EXT}"

いくつかのテスト:

$ ./MyScript.sh 
MyScript - .sh

$ bash MyScript.sh
MyScript - .sh

$ /Users/Jonathan/Scripts/bash/MyScript.sh
MyScript - .sh

$ bash /Users/Jonathan/Scripts/bash/MyScript.sh
MyScript - .sh
于 2012-05-19T18:59:03.813 に答える
0

dir をより便利にするために (パスのないローカル ファイルが入力として指定されている場合)、次のことを行いました。

# Substring from 0 thru pos of filename
dir="${fullpath:0:${#fullpath} - ${#filename}}"
if [[ -z "$dir" ]]; then
    dir="./"
fi

これにより、次のように入力ファイルのベース名に接尾辞を追加するなど、便利なことを行うことができます。

outfile=${dir}${base}_suffix.${ext}

testcase: foo.bar
dir: "./"
base: "foo"
ext: "bar"
outfile: "./foo_suffix.bar"

testcase: /home/me/foo.bar
dir: "/home/me/"
base: "foo"
ext: "bar"
outfile: "/home/me/foo_suffix.bar"
于 2013-08-08T23:59:55.920 に答える
0

使用できます

sed 's/^/./' | rev | cut -d. -f2- | rev | cut -c2-

ファイル名を取得し、

sed 's/^/./' | rev | cut -d. -f1  | rev

拡張子を取得します。

テストケース:

echo "filename.gz"     | sed 's/^/./' | rev | cut -d. -f2- | rev | cut -c2-
echo "filename.gz"     | sed 's/^/./' | rev | cut -d. -f1  | rev
echo "filename"        | sed 's/^/./' | rev | cut -d. -f2- | rev | cut -c2-
echo "filename"        | sed 's/^/./' | rev | cut -d. -f1  | rev
echo "filename.tar.gz" | sed 's/^/./' | rev | cut -d. -f2- | rev | cut -c2-
echo "filename.tar.gz" | sed 's/^/./' | rev | cut -d. -f1  | rev
于 2014-05-22T20:24:16.787 に答える
0

tarおそらく、これを行うためのオプションがあります。男をチェックしましたか?それ以外の場合は、Bash 文字列展開を使用できます。

test="mpc-1.0.1.tar.gz"
noExt="${test/.tar.gz/}" # Remove the string '.tar.gz'
echo $noExt
于 2013-02-05T08:51:39.993 に答える
-1

forループを使用trして、パスからファイル名を抽出することもできます...

for x in `echo $path | tr "/" " "`; do filename=$x; done

パス内のすべての「 /tr 」区切り文字をスペースに置き換えて文字列のリストを作成し、ループがそれらをスキャンして最後の区切り文字を変数に残します。forfilename

于 2011-07-01T08:20:22.673 に答える