for i in `ls *.txt`
という感じで、
カレントディレクトリにあるtxtという拡張子のファイルを一気に取り扱うことが多々ある
しかしそのファイル名に空白文字が含まれていると、for i in の下で分解されたときに
2つのファイル名だと勘違いされて実行されてしまう
例えば hoge foo.txt というhogeとfooの間に空白文字が入ったファイル名の場合
hogeとfoo.txtがそれぞれiに代入されてループ文が行われることになる
一番の解決方法は空白文字を入れないようにすること(自分なら絶対入れないけど)だけど
ネット上のファイルを一気に落としてきたときの話なので、どうしようもない
色々と調べたところこんな記事を見つけた
■ 参考
逆引きシェルスクリプト/スペースが含まれる文字列を1行として扱う方法 - Linuxと過ごす
シェルスクリプトのfor文より前に
IFS=$'\n'
と書いておけばおーけー。
これで区切り文字を改行だけにすることができる。
もしシェルスクリプト内で、元の仕様に戻したいときは、
IFS_BACKUP=$IFS
IFS=$'\n'
としておいて、随時戻せば良い。
------------
他の方法としては・・・
新しくファイル名からtrを使って半角スペースを削除する方針を取る
#!/bin/sh
for file in ./*
do
mv "$file" `echo $file | tr ' ' '_'`
done
forで今いるディレクトリのファイルをすべて取得
ファイル名に半角スペーズがあれば、すべてアンダースコアに置換
なければ、そのまま
一応これで解決