ファイル名から空白を取り除くスクリプトをあれこれ試していますが、なかなかうまくいきません。さまざまな情報をあたってみるものの、それらで紹介されているスクリプトは我が家のCentOS7.xではエラーが返されてしまいうまくいきませんでした。
しかし大体どの情報でも、findで(空白を含む)ファイルを探し出し、renameで空白を取り除くというプロセスは基本的に同じ。
というわけで、findコマンドはともかく、やっぱりrenameコマンドの書式を再確認してことに臨むことにしました。その結果、上記で紹介されていたさまざまなサイトのスクリプトはどうやらrenameコマンドの書式に問題がある(少なくともうちの環境では)ことがわかり・・・。
renameコマンドの書式の構造は『rename命令+変更前の文字列+変更後の文字列+変更したいファイル』という形式を取ります。なので、上記検索で紹介されていた
$ find . -name “* *” | rename ‘s/ /_/g’
というスクリプトでは、引数不足でエラーが返されてしまうわけです(うちの環境では)。
だから、パイプで渡す先のrename部分を「rename (空白) (空白除去) 該当ファイル」という構造にしてあげればうまくいくのでは・・・?
そこで実験してみることに。
$ touch “a a.txt”
$ touch “b b.txt”
$ ls -l
-rw-rw-r– 1 hoge foo 0 6月 24 18:50 a a.txt
-rw-rw-r– 1 hoge foo 0 6月 24 18:50 b b.txt
$ find . -name “*.txt” | rename \ _ *.txt
$ ls -l
-rw-rw-r– 1 hoge foo 0 6月 24 18:52 a_a.txt
-rw-rw-r– 1 hoge foo 0 6月 24 18:52 b_ b.txt
となって、目的が達成されることがわかりました。なお、b b.txtは半角スペースを二つ重ねているため、処理後に作成されるファイルが「b_ b.txt」になっています。これについてはまた別途考えなければいけませんが、このスクリプトで空白を除去するという点での最初のステップがクリアできたようです。
一応書き留めておくと、
find . -name “*.txt”部分でカレントディレクトリから全てのテキストファイルを見つけ出しています。
ついでそれをパイプで
rename \ _ *.txt部分に繋ぐわけですが、こちらは先ほどの(正しい)書式になっています。
最初の引数は「\ 」。つまり(半角の)空白(特殊文字なのでバックスペース必須)。そして一つスペースで開けて次の引数が「_」アンダーバー。この部分で『(半角の)空白をアンダーバーに置き換える』指定をしているわけです。
そして最後の引数はワイルドカード指定のファイル名。「全てのテキストファイル」に対しての指定となっています。
このスクリプトを活用してファイル名から全ての種類の空白を取り除くことができれば、あとは前に作ったリネームのスクリプトでファイル名の一括変換ができそうです。
一歩前進!(^ ^)
P.S.
b_ b.txtをb__b.txtにするには、もう一度スクリプトを実行させることで対応可能なことを確認(パイプでrenameを繋げていくのではうまくいきませんでした)。全角スペースの指定も同様に処理することでクリアできることを確認しました!