Bus errorとSegmentation faultに困ったら見るブログ

物理の研究者による日々の研究生活のメモ書きです ( python/emacs/html/Japascript/シェルスクリプト/TeX/Mac/C言語/Linux/git/tmux/R/ポケモンGO)

【シェルスクリプト】ファイル名に空白文字が入っていても処理する方法、trで置換してみる

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で今いるディレクトリのファイルをすべて取得
ファイル名に半角スペーズがあれば、すべてアンダースコアに置換
なければ、そのまま

一応これで解決

[Linux Shell] ファイル名のスペースをアンダースコアに変換する方法