つれづれ電脳記(日くらしPCに向かひて)

つれづれなるままに、日くらしPCに向かひて、その悪戦苦闘ぶりをそこはかとなく書き付くるおじさん。たまに雑談[管理人:goosyun]

つれづれなるままに、日くらしPCに向かひて、デジタル関係の悪戦苦闘ぶりをそこはかとなく書き付くるおじさんです。
たまに雑談してます。連絡・問い合わせフォームは、ページ最下部に置いています。[著者(運営人):goosyun]

(当ブログには本文中に広告リンクが含まれています。)

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


《2024年10月6日追記》
 renameコマンドを導入し、拡張子の一括変更を行いました。
 何の問題もなく、あっという間に変更できました。
  こちらの記事をご覧ください。

《2024年10月14日追記》
 Microsoft製のエディタ「メモ帳」で開くと文字化けして判読不能です。
 そこで、メモ帳でも読めるように文字コードを変換しました。
  こちらの記事をご覧ください。
      「昔のemlメールファイルを文字化けなくメモ帳で開く方法」