2012-04-15 11 views
0

ファイル名からハイフンを削除するための小さなBashスクリプトを作成しようとしています。例えば、私は名前を変更する:Bashでファイル名からハイフンを削除する

CropDamageVO041412.mpg

私はバッシュに新たなんだ

CropDamageVO041412.mpg

に、とても穏やかな:]任意の助けてくれてありがとう

答えて

3
FN=CropDamageVO-041412.mpg 
mv $FN `echo $FN | sed -e 's/-//g'` 

バッククォート( ``)は、その中でコマンドを実行し、そのコマンドの出力を式で使用するように指示します。 sedパートは正規表現を適用してファイル名からハイフンを削除します。

for i in *VO-*.mpg 
do 
    mv $i `echo $i | sed -e 's/-//g'` 
done 
+0

これは、一般的なPosixシェルとの互換性の利点があります。もし私がbash kool-aidの*すべて*を飲むべきかどうかは決してわかりません。 – DigitalRoss

+0

これは、私がめったにアンティークシェルを使用していない時でさえ、私が実際にそれらを使用していない程度に、派手なbash-ismsを避ける習慣になったのです。 SolarisとAIXには多くの回答があります。 – jimw

+0

うわー、それはすばやい返信でした。私は、[NAME] VO- [DATE] .mpg – idoperceive

0
f=CropDamageVO-041412.mpg 
echo ${f/-/} 

または、もちろん、

mv $f ${f/-/} 
6

はこのお試しください:

for file in $(find dirWithDashedFiles -type f -iname '*-*'); do 
    mv $file ${file//-/} 
done 
を特定のパターンにマッチする現在のディレクトリ内のすべてのファイルにこれを行うには

これは、あなたのディレクトリ名前にダッシュはありません。それはこれを破るだろう。

${varname//regex/replacementText}構文はhereと説明されています。部分文字列置換を検索するだけです。

また、ディレクトリまたはファイル名にスペースが含まれていると、これが破損します。私が言ったように、それはもう少しだ、

for file in *-*; do 
    mv $file "${file//-/}" 
done 

これは、変更したいファイルを含むすべてのディレクトリで実行されるようになるという欠点を持っていますが、:あなたは、ファイル名にスペースがある場合は、これを使用する必要がありますロバスト。

+0

私が決して覚えることのできない$ {//}構文のための+1 – jimw

+1

ファイル名にスペースがある場合は、$ fileを二重引用符で囲む必要があります(例えば、 'mv" $ file "" $ {file// - /} "') –

+0

@GordonDavisson良いキャッチ。私の答えを更新しました。 –

関連する問題