Bluepostech

プログラムとかはこっち

【bash】タイトル名に入ったスペースを置換する

タイトルに入ったスペースは、バグの原因のひとつになる。たとえば「I love you.txt」というファイルを「love letter.txt」という名前にリネームするとき、次のようにするとエラーが出る。

mv I love you.txt love letter.txt

なぜならば、単語がスペースで区切られているせいで、bashにとってはmvのあとにオペランドが5つも並んでいることになるからだ。このような場合、引用符で囲めばちゃんと動くようになる。

mv "I love you.txt" "love letter.txt"

でも、正直毎度毎度これをやるのは面倒でもあるし、CUIで処理するにはスペースを全部アンダーバーに置き換えておきたい。そこで組んだコマンドが次だ。

for file in * ; do echo $file ; mv "${file}" `echo $file | sed -e 's/ /_/g'` ; done

このコマンドを一発打てばカレントディレクトリのファイルの名前に含まれるスペースが全部アンダーバーに置き換わる。

とても見難いので、改行してスクリプト形式にすると次のようになる。

for file in * 
do
echo $file
mv "${file}" `echo $file | sed -e 's/ /_/g'`
done

doループはカレントディレクトリにあるすべてのファイルにかけてある。

バッククオートの後ろは、echoでファイルの名前を出して、パイプでsedに渡してスペースをアンダーバーに置換している。