パソコン悪戦苦闘記録

Linuxで大量のファイルの名前を一括変更~作業自動化

 20年以上昔の大量のメールを、クラウド上のストレージに保存しています。
 当時、会社業務で生じた疑問などを、全国の同じ担当部署の社員同士で意見交換し、共有したメールです。
 古過ぎて、今となっては役に立たない情報が多いものの、ちょっと読み直してみようと、自宅PCにダウンロードしました。

 当時のメールソフト Outlook Express で送受信したメールなので、拡張子「eml」のファイルです。今では Outlook Express は使っていませんが、現在でも、Outlookなどの別のメールソフトで開くことができます。
 拡張子「eml」のままでもよいのですが、そのすべてをテキストファイルに変換することにしました。テキストファイルだと、grepコマンドなどでの検索が容易になるからです。
 テキストファイルへの変換といっても、単純です。ファイル名の拡張子部分を、「eml」から「txt」に書き換えるだけです。
 ただし、大量のファイルなので、一つ一つ手作業で書き換えるのは現実的ではありません。そこで、ファイル名変更作業を自動化することにしました。
 
 WindowsのコマンドプロンプトやPowerShellはあまりなじみがなく、VBAを使おうかとも思ったのですが、Linuxを習得中なので、勉強を兼ねてLinux シェルを使うことにしました。
 Web上の情報を参考にすれば、難なくできるだろうと思っていたのですが、これが予想外に苦戦しました。
 どこでつまづいたのか、記録しておきます。





【1】 renameコマンド
 renameコマンドを使えば、複数のファイル名を一括して変更ができるようです。ただ、Ubuntuにおいては、そのコマンドはデフォルトでは入っていません。今後もrenameコマンドを頻繁に使うならば、この際インストールしてもいいのですが、あまり使うことはないような気がします。よって、renameコマンド以外の方法をとることにしました。


【2】 mvコマンド
 mvコマンドは、ファイル移動もできるほか、ファイル名変更にも使えます。
 そこで、mvコマンドを使った、次のシェルスクリプトを作りました(テスト用に作ったスクリプトなので、拡張子「csv」を「txt」に変更するものとなっています。)

 #!/bin/bash 
 for fname in *.csv 
 do 
 mv $fname ${fname%.csv}.txt 
 done 



【3】 改行コード
 上記【2】のスクリプトは、Windows上のサクラエディタを使って作ったので、改行コードが「CrLf」となっていました。
 改行コードが「CrLf」のスクリプトは、Ubuntuではエラーが出て動きません。
 サクラエディタでのファイル保存の際、改行コードを「Lf」とすることで、Ubuntuでも動くようになりました。


【4】 画面更新
 上記【3】の作業によって、エラーは出なくなったのですが、実行後、なぜかファイル名変更ができていません。
 原因が分からず、あれこれやっている中で、いったん別のディレクトリに移動して、また元のディレクトリに戻れば、ファイル名変更ができていました。スクリプト実行によって、ファイル名変更ができているにもかかわらず、画面上の表示に反映されていないだけだったのです。いったん、別ディレクトリに行って、また戻れば、画面更新されて、ファイル名も更新されることが分かりました。


【5】 ファイル名の制限
 上記【2】のスクリプトは、テスト環境ではまともに動きます。
 ところが、本物のファイルを対象に、本番環境で試すと、エラーが出ます。
 「mv: 宛先の '×××.txt' はディレクトリではありません
というエラーメッセージです。
 なぜ、本番ではエラーとなるのか。
 テスト環境では、ファイル名が半角アルファベットなのに、本番ではファイル名が全角の日本語となっています。テストと本番との違いは、それくらいです。ですから、おそらくファイ名の文字がネックとなっているものと推測されます。


 以上のとおり、結局、大量にあるファイルの、ファイル名一括変更は、今の時点では成功していません。
 mvコマンドを使ったシェルスクリプトではうまくいかないので、今度、renameコマンドで試してみます。
 コマンドを自由に駆使できるようになるためには、このような試行錯誤が遠回りのようですが必要なのです。




それでは、また次の記事で
goosyun

コメント一覧

goosyun
narkejp さん
 いつも、丁寧な解説、ありがとうございます。
 今回も、emlファイルの取り扱い例を詳しくご紹介いただき、大変参考になります。

 取り急ぎ、こちらの現状報告、経過報告だけをさせていただきます。
 mvコマンドはあきらめて、renameコマンドを導入したところ、拍子抜けするほど簡単に、拡張子の書き換えができました。しかも、大量のファイルなのに、一瞬で処理が終わりました。

 さて、拡張子を「.txt」に変えたファイルですが、結論だけ申しますと、使えています。少なくとも見かけ上はテキストファイルとなりました。サクラエディタで開くと、文字化け等することなく、全文を読むことができます。本文(body)ばかりでなく、メールヘッダー部分も、テキストとして閲読可能です。メールヘッダー部分には、送受信日時、送信者情報、受信者アドレス、「件名」の文字列などが含まれているので、検索や分類に使えそうです。
 おそらく、拡張子を書き換えるだけの方法は、まともな方法ではないとは思われます。それでも、全国の社員同士での当時の情報交換、やり取りを読み返し、検索キーワードを使って必要な情報だけを引っぱり出すという用途においては、十分に使えそうな気がします。
(emlファイルの拡張子をtxtに書き換えるというのは、個人的に試しにやってみた結果です。1つのファイルで試したところ、テキストファイルで開けたので、「ならば・・・」ということで、すべてのファイルの拡張子を書き換えることにしました。)
narkejp
はて? Outlook Express の eml ファイルの拡張子を txt に変換しただけではテキストファイルにはならないんでは? たしか Outlook 等で該当のファイルを指定して export してやるという手順を踏む必要があったと記憶しています。Windows で eml to txt 変換のフリーソフトもあったはずですが、名前は忘れました。で、変換したテキストファイルは Shift-JIS なので、これを nkf で UTF-8 に変換(-w)します。-Lu は改行コードを Unix 形式(Lf) に変換します。
 nkf -w -Lu sjisfile.txt > utf8file.txt
この処理を一括して行うには、簡単にはバッチ処理という方法がありますので、例えば多数の sjisfile のファイル名のリストをもとにこういうコマンドの文字列をずらずらと生成する awk スクリプトを考えればよい、ということに。うまくいったら、該当ファイルがどんなに多くても一括して処理できます。
他の方法もあると思いますが、私は MS-DOS の時代からそんな方法で処理していました。
名前:
コメント:

※文字化け等の原因になりますので顔文字の投稿はお控えください。

コメント利用規約に同意の上コメント投稿を行ってください。

 

  • Xでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

最近の「Ubuntu」カテゴリーもっと見る

最近の記事
バックナンバー
人気記事