2017-05-27 26 views
1

拡張子でファイルをソートするスクリプトを書いています。私はファイルの名前でこれを行う方法を知っています。問題は、同じファイルの名前に拡張子がないことです。たとえば、私がファイル:file.txtを持っている場合、簡単な拡張子を得るのに問題はありませんextension="${filename##*.}"。しかし、ファイル名がfilenameの場合、この方法は機能しません。ファイルの拡張子を取得し、それをBashスクリプトの変数に入れる他のオプションはありますか?Bash - ファイルの拡張子を取得する

答えて

0

:のようにあなたが何かを行うことができます

$ ls file* 
file1 file1.txt file2 

:のような状況では

+0

誰のためにdownvotes:何が間違っている私を説明することができれば私は私の答えを確認することができます。 – FedericoCapaldo

+1

私はあなたに投票していませんが、私はあなたの解決策が簡単に壊れていることを伝える必要があります。ファイル 'spaced.txt 'を' touch'してコードをテストするだけです。さらに、なぜ 'ls'の出力を解析してはならないのか、forとglobingを使ってファイルをループする方法(つまり、' for file in * ')について、グーグルが言及しています - もう一つの灰色の点は、bashにパラメータ拡張必要な結果をもたらすことができます。テディベアに勝つためにルナ公園の機関銃を使うようなものです。さらに、すべての 'sed'バージョンが同じように動作するわけではありません。 –

1
filename="file.txt" 
ext="${filename##*.}" 
if [[ "$ext" != "$filename" ]]; then echo "$ext"; else echo "no extension"; fi 

出力:

 
txt 

filename="file" 
ext="${filename##*.}" 
if [[ "$ext" != "$filename" ]]; then echo "$ext"; else echo "no extension"; fi 

出力:

 
no extension 
+0

しかし、問題は、名前の拡張子を持たないファイルはtxtやjpgファイルなので、適切なフォルダに置いてください。 – Sigger

3

[[ようbashismsなし:

case $filename in 
    (*.*) extension=${filename##*.};; 
    (*) extension="";; 
esac 

Bourne-heritageシェルで動作します。

2

を削除すると、エクステンション、除外オリジナルからファイルのベース名を得ることができます。

base=${filename%.*} 
ext=${filename#$base.} 

私はcase文が好きです。その意図ははっきりしています。あなたが唯一のbashで変数にファイル名のファイル拡張子を置く方法を求めているようだ

$ ls file* |awk -F. '{print (NF>1?$NF:"no extension")}' 
no extension 
txt 
no extension 
1

あなたはソートの部分について質問していません。 これを行うには、次の簡単なスクリプトを使用して、各ファイルの拡張子をファイルリストから出力できます。

#!/bin/sh 
filesInCurrentDir=`ls` 
for file in $filesInCurrentDir; do 
    extention=`sed 's/^\w\+.//' <<< "$file"` 
    echo "the extention for $file is: "$extention #for debugging 
done 

解析される現在のファイルの拡張子を含む変数は、extentionと呼ばれます。コマンドsed 's/^\w\+.//は、ファイル名に最初のドットが見つかるまで、任意の長さの文字と一致してから削除されます。したがって、複数のファイル拡張がある場合、これらはすべてリストされます(たとえば、file.txt - > get extention txt,-> get extention odt.pdf)。

現在のフォルダの内容上記のスクリプトの

aaab.png 
abra 
anme2.jpg 
cadabra 
file 
file.png 
file.txt 
loacker.png 
myText 
name.pdf 
rusty.jgp 

結果(これはあなたがループにフィードファイルのいずれかのスペース区切りのリストを指定できます):

the extention of aaab.png is: png 
the extention of abra is: 
the extention of anme2.jpg is: jpg 
the extention of cadabra is: 
the extention of file is: 
the extention of file.png is: png 
the extention of file.txt is: txt 
the extention of loacker.png is: png 
the extention of myText is: 
the extention of name.pdf is: pdf 
the extention of rusty.jgp is: jgp 

でこの方法では、拡張子のないファイルは拡張子変数が空になります。

関連する問題