表示されているファイル接尾辞、パス部分からのpath文字列をBash?

StackOverflow https://stackoverflow.com/questions/125281

  •  02-07-2019
  •  | 
  •  

質問

指定された文字列のファイルパスなど /foo/fizzbuzz.bar, どのようにして使っていbashの抽出を fizzbuzz 部分の文字列?

役に立ちましたか?

解決

こちらはどうやって実行するかである#や%【オペレーターにBash.

$ x="/foo/fizzbuzz.bar"
$ y=${x%.bar}
$ echo ${y##*/}
fizzbuzz

${x%.bar}${x%.*} すべて削除した後、ドットもしくは ${x%%.*} 除去すべてのコンテントタイプにマップ

例:

$ x="/foo/fizzbuzz.bar.quux"
$ y=${x%.*}
$ echo $y
/foo/fizzbuzz.bar
$ y=${x%%.*}
$ echo $y
/foo/fizzbuzz

文書の Bashのマニュアル.探し ${parameter%word}${parameter%%word} 末尾の部分にマッチング。

他のヒント

のbasenameコマンド:

NAME=$(basename /foo/fizzbuzz.bar .bar)

純bash、二つの別々の業務:

  1. 削除のパスからの道-文字列:

    path=/foo/bar/bim/baz/file.gif
    
    file=${path##*/}  
    #$file is now 'file.gif'
    
  2. 削除のパスからの文字列:

    base=${file%.*}
    #${base} is now 'file'.
    

使用basenameいを達成するために以下のこと:

for file in *; do
    ext=${file##*.}
    fname=`basename $file $ext`

    # Do things with $fname
done;

そこに必要な、知識のファイルの拡張子や作品を有する場合あっても、そのファイル名はドットでのファイルの名前で延長);とができずにプログラム basename が、この一部であるGNU coreutilsすべきである船舶の他distro.

純bash方法:

~$ x="/foo/bar/fizzbuzz.bar.quux.zoom"; 
~$ y=${x/\/*\//}; 
~$ echo ${y/.*/}; 
fizzbuzz

この機能をご利用いただいてい男bashの下での"パラメータ展開".非bashの方法に溢れる:awk、perl、sedいます。

編集:作品とドットファイル 接尾辞 る必要はありませんの接尾辞(拡張子) 仕事ドットの 名称 そのものです。

のbasename、次の二つのうちどちらかの機能はいかが?:

mystring=/foo/fizzbuzz.bar
echo basename: $(basename "${mystring}")
echo basename + remove .bar: $(basename "${mystring}" .bar)
echo dirname: $(dirname "${mystring}")

は出力:

basename: fizzbuzz.bar
basename + remove .bar: fizzbuzz
dirname: /foo
perl -pe 's/\..*$//;s{^.*/}{}'

を使用 basename このシステムについてのファイルの拡張子はいませんか?

してしまったということもあって、様々な正規表現の提案な対応ファイル名以上含有しました。"

以下のように対応ダブルませんでした。Ohファイル名を含むを"/"(ぶら)

への言い換えパスカルまこのスクリプトがいます。なかなか時間が短い"


  #!/usr/bin/perl
  $fullname = $ARGV[0];
  ($path,$name) = $fullname =~ /^(.*[^\\]\/)*(.*)$/;
  ($basename,$extension) = $name =~ /^(.*)(\.[^.]*)$/;
  print $basename . "\n";
 

が使えない場合は、basename示唆されているその他の投稿を利用できることがsed.ここでは(醜い)の一例です。ではないのですが、作品を抽出した文字列と置き換え、入力した文字列になります。

echo '/foo/fizzbuzz.bar' | sed 's|.*\/\([^\.]*\)\(\..*\)$|\1|g'

んの出力

fizzbuzz

に加え、 POSIX conformant構文 使用 この答え,

basename 文字列 [接尾辞]

として

basename /foo/fizzbuzz.bar .bar

GNU basename 支援別の構文:

basename -s .bar /foo/fizzbuzz.bar

同じ結果です。の違いと特長は、 -s 意味 -a, を支援する複数の引数:

$ basename -s .bar /foo/fizzbuzz.bar /baz/foobar.bar
fizzbuzz
foobar

こともできるファイル名-安全分離することにより出力NULバイトを使用 -z オプションは、例えばこれらのファイルを含むブランクス、改行、glob文字が取りざたされるようになった ls):

$ ls has*
'has'$'\n''newline.bar'  'has space.bar'  'has*.bar'

読み込配列:

$ readarray -d $'\0' arr < <(basename -zs .bar has*)
$ declare -p arr
declare -a arr=([0]=$'has\nnewline' [1]="has space" [2]="has*")

readarray -d が必要でBash4.4たします。のための古いバージョン、ループ:

while IFS= read -r -d '' fname; do arr+=("$fname"); done < <(basename -zs .bar has*)

ことに留意してくださいことを示唆perl解で取り除いた後の最初のコンテントタイプにマップ

$ echo some.file.with.dots | perl -pe 's/\..*$//;s{^.*/}{}'
some

だいたいでperl、この作品:

$ echo some.file.with.dots | perl -pe 's/(.*)\..*$/$1/;s{^.*/}{}'
some.file.with

ものをご使用の場合はBashの解 y=${x%.*}basename "$x" .ext がわかっている場合は、それを延長もより簡単になります。

のbasenameは、削除します。また、削除の接尾辞が変更されていない場合は、一致する場合は、接尾辞をファイルがい知る必要があるの接尾辞に渡すコマンドです。その他利用できるmvとの新しい名称する。

組み合わせのトップの定格は-格答えのファイル名のフルパス:

$ x="/foo/fizzbuzz.bar.quux"
$ y=(`basename ${x%%.*}`)
$ echo $y
fizzbuzz
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top