2013-07-19 16 views
5

ディレクトリ(/path/to/local)にファイル名のリストがあります。私はそれらのファイル名のすべてから特定の数の文字を削除したいと思います。ディレクトリの複数のファイル名の末尾に 'x'文字分を削除するBashスクリプト?

例ファイル名:私は、ファイル拡張子の前の最後の5つの文字を削除したいすべてのファイル名で

iso1111_plane001_00321.moc1 
iso1111_plane002_00321.moc1 
iso2222_plane001_00123.moc1 

。例えば

iso1111_plane001_.moc1 
iso1111_plane002_.moc1 
iso2222_plane001_.moc1 

私は、これはsedを使用して行うことができると信じて、私は、正確なコーディングを決定することはできません。何かのように...

for filename in /path/to/local/*.moc1; do 
    mv $filname $(echo $filename | sed -e 's/.....^//'); 
done 

...しかしそれは動作しません。申し訳ありませんが、私がsedオプションを盗んだ場合、私は多くの経験がありません。

+0

'^'は行頭にあり、定義の前には何もできません。 – Kevin

答えて

6
mv $filname $(echo $filename | sed -e 's/.....\.moc1$//'); 

または

echo ${filename%%?????.moc1}.moc1 

%%は

+0

ありがとう!あなたが提示した2番目のオプションは、bashスクリプトで完全に機能しました。 – user2600230

+0

sedの例が間違っています(拡張子を考慮していません)が、bashの解決策では+1です –

+0

@glennjackman、拡張子はどうですか? –

1

このsedコマンドは、あなたがたすべての例のために働くだろう... bashの内部演算子です。あなただけの特別「ファイル名の最後の拡張子の前に5つの文字を削除」したい場合は

sed -e 's/\(.*\)_.*\.moc1/\1_.moc1/' 

しかし、このコマンドは何をしたいです:

sed -e 's/\(.*\)[0-9a-zA-Z]\{5\}\.\([^.]*\)/\1.\2/' 

あなたが好きなので、あなたのスクリプトでこれを実装することができます:

for filename in /path/to/local/*.moc1; do 

    mv $filename "$(echo $filename | sed -e 's/\(.*\)[0-9a-zA-Z]\{5\}\.\([^.]*\)/\1.\2/')"; 

done 

まずコマンド説明

そして、 .*\.moc1

それはそれが最初に手にすべてを発見したテキストを置き換える:それは.moc1が見つかるまで続いそれはすべての文字を破棄\(.*\)_

:最初のアンダースコアまで、すべての文字をつかんによっての

最初sedコマンドの機能/\1

そして最後端に背中.moc1拡張子を追加し、正規表現を終了します:.moc1/

括弧内の

2番目のコマンドの説明

第1、第2に、すべての文字をつかんによってsedコマンド作品:\(.*\)

そして、5つの文字を破棄、またはより具体的にすることができますので、文字をつかんで停止することを余儀なくされ、5つの文字その範囲は0-9で嘘、AZ、およびAZ:[0-9a-zA-Z]\{5\}

はその後、最後の拡張子をマークするドット'.'文字が来る:\.

そしてドット以外の文字をすべて探します。 \([^.]*\)

最後に、それは.文字で区切られた第一及び第二のキャプチャグループを持つすべてのそのテキストを、置き換え、正規表現を終了します:/\1.\2/

+0

説明をありがとう!私はこれを試してみる。 – user2600230

+0

文字に基づいてコードを削除してくれてありがとう - それはOPの質問ではなかった - それは私のものだった – kris

0

これかもしれないこれは、我々が最後拡張子をつかんされることが保証されますあなたのために働きます(GNU sed):

sed -r 's/(.*).{5}\./\1./' file 
関連する問題