スクリプト内のfor文の中で読み込んだファイル名の空白を取り除こうとして様々なコマンドを組み合わせて試行錯誤してみたのですが、どうにもうまくいきません。どうやら、そもそもlsコマンドで読み込んで変数に格納した時点で空白を含むファイル名が空白で分割されているっぽいんですよね。
例えば、a a.txtというファイルをlsコマンドで読み込んで変数に格納し、mvコマンドで別ファイル名を与えようとすると、
mv: `/hoge/foo/bar/a’ を stat できません: そのようなファイルやディレクトリはありません
mv: `a.txt’ を stat できません: そのようなファイルやディレクトリはありません
というエラーが返されるのです。これはつまりa a.txtの空白部分で分割され、aというファイルとa.txtというファイルで扱おうとしてファイルが見つからないってことのはず。
ということはつまり、for文でファイル名を変数に格納する前の段階でファイル名の空白を取り除いておく必要があるのです(空白を含まなければ前に書いたスクリプトできちんと処理できていた)。
そこでまた色々と情報を漁ってみたところ、findコマンドを使ってカレントディレクトリ内のファイルの空白部分をアンダーバーに置き換える(一括で置き換える)スクリプトが紹介されていました。若干の修正が必要でしたが、結論から言うとこれでカレントディレクトリ内のファイル名の空白をアンダーバーに変換できました。
$ find . -name “* *” | rename ‘s/ /_/g’ *
カレントディレクトリ内に、a a.txt、b b.txt、c c.txtという三つの(それぞれ空白を含む)ファイルを用意し、上記スクリプトを実行したところ・・・。
]$ ls -l
合計 4
-rw-rw-r– 1 hoge foo 0 3月 20 18:01 a_a.txt
-rw-rw-r– 1 hoge foo 0 3月 20 18:01 b_b.txt
-rw-rw-r– 1 hoge foo 0 3月 20 18:02 c_c.txt
と、a a.txtはa_a.txtに、そしてそれ以後も全て空白部分がアンダーバーに置き換えられていることが確認できました。
ファイル名を変換するスクリプトを走らせる前段階でこのスクリプトを走らせれば、目的は達成できそう!
これは大きな前進かも!