初歩のシェルスクリプトで遊ぶ[ファイルのリネームツール、のようなもの?_(8)]

alpha3

→のGoogleドライブに、アルファ版3を置きました。2とあんまり変わってません。高速化目的で配列をややっこしい書き方してたところを、普通の書き方に戻してます。bash5なら、こっちのほうが早い。
気力が失せつつあるんで、たぶんこれでしばらくは更新しません。

下に、説明書の一枚をコピーして置いときます。画像ファイルは抜けてます。はてなフォトがwebpに対応してないから、面倒なもんで。


ファイルリネーム『burdock』端末UI説明書

実行方法
burdockUI.sh ./dir/

引数にディレクトリを指定して実行してください。

コマンドライン版のファイルも必要です。コマンドライン版の説明書を参考に適切に配置して、必要なファイルには実行権限を与えておいてください。

制作環境(動くかもしれない環境)
  • Ubuntu20.04 bash5.0.17
  • 256色表示ができる端末を推奨
推奨使用環境など

端末用のアプリケーションですが、GUI環境の端末エミュレータ上で使い、ファイラーやテキストエディタを併用すると、快適に使えます。

リネーム対象のファイルは、300個程度で使用することを想定しています。さらに多くのファイルを扱うときは、まず数十ファイルでどのようにリネームするか検討、決定してから、ファイルを追加します。限界はハードウェアの性能にも依存しますが、多くともファイル2000個程度に収めるべきでしょう。

高性能のハードでも、残念ながら、マルチコア環境の恩恵は得られません。

制限事項

ファイル名に改行文字を含むファイルは処理できません。

多数のファイルを処理する際に、それらのひとつでも、ファイル名に改行文字を含んではいけません。

ファイル名の先頭文字が、半角空白で開始してはいけません。

機能概説

書き戻し機能

  • i-node番号によるファイル管理。リネーム前の状態にファイル名を書き戻すことができる。この機能はUIが提供しており、Coreは書き戻し機能を持たない。

安全機能

  • ファイル名の重複チェック機能。UIはリネーム実行直前に重複検査を行い、リネーム中とリネーム後に重複が発見されたならば、これを報告する。


ファイルサーチと表示

  • ファイルサーチ、ファイルリネーム結果予測を、端末に表示する。
  • ファイルサーチとソートの切り替え。lsコマンドのオプションを切り替える。
  • ファイルソートの固定。ソート結果を固定し、以後はリネームしても処理順番を変えない。
  • 任意ファイルのリネーム禁止設定。サーチしたファイルの一部をリネームできないように設定する。1ファイル単位指定、ワイルドカード指定、grepコマンドでのテスト指定が可能。
  • ファイルをリネームするモードと、ディレクトリをリネームするモードの切り替え。Coreはディレクトリとファイルを一括処理するが、UIはどちらか一方のみに処理を絞る。

ファイル情報の取得と管理

  • プラグインファイルによるファイル情報テキストファイルの作成。ファイルの更新日時を取得したり、画像ファイルのサイズやEXIF情報を取得する。
  • リネーム結果予想を、テキストファイルにして書き出す。テキストファイルはCoreが提供する変数機能で利用できる。

コマンド入力補助

  • Coreに与えるコマンドやオプションの入力補助。入力補助し、テキストファイルに書き出し、読み込み、テキストエディタと連携する。
  • コマンドの自動解析と結果表示。コマンドを入力するたびにCoreでコマンド解析を実行し、その結果を表(table)にして表示する。


UI自身についての機能

  • 起動時処理対象ディレクトリを固定する。作業用ディレクトリは新規に作成し、専用のディレクトリだけで作業を行う使い方を推奨。
  • 入力キーの一部をカスタマイズ。初期設定はテンキー付きキーボードを想定しているが、これは入れ替えが可能。
  • ファイル一覧表示の切替機能。通常表示、色数の少ない表示、簡易表示の切り替え。

できないこと・あきらめたこと

  • 複数ディレクトリにまたがる処理。UIは、単独のディレクトリ内部でのみ処理を行う。
  • ファイル名が半角空白から開始するファイルのリネーム。Coreで直接にならリネーム可能だが、UIでは扱えない。
  • ファイル名に改行文字を含んだファイルのリネーム。Coreでも扱えない。UIでは対象ディレクトリの中に一つでも存在すると、他のファイルの処理にも悪影響がある。
  • 詳細なファイル検索、ソート機能。
  • 「適用範囲指定」のリネーム途中での切り替え。Coreは入力されたファイルを全て一律に処理する。「最初のコマンドは一部のファイルを処理して、次のコマンドでは全てを処理し、……」といった、切り替えはできないため。
  • ファイルそのもののバックアップ機能。
  • 安心と信頼の提供。



UI活用_i-node番号による書き戻し

UIは、シェル配列変数「START_FILES」に、ファイル名と、i-node番号を記憶しています。

「開始状態に戻す」を実行すると、i-node番号をもとに、リネーム前のファイル名に戻す操作を行います。

このとき、ファイル名の重複予想処理は行いません。重複が起きたときは、いったん別名にリネームしてから、再実行してください。

この機能は、些細な切っ掛けでリセットされます。

  • プロセスを終了し、再び起動したとき。
  • ファイル数が増えたり減ったりしたとき。
  • i-node番号の変更を検知したとき。ファイラーによるリネームなどで起きる。
  • 作業対象ディレクトリを切り替える処理を実行したとき。

i-node番号が変更されると、『burdockUI』は、変更を感知して、いったんリセットを行います。リセットすると、「START_FILES」は消去され、作り直します。つまり、リネーム前のファイル名に戻せなくなります。


これは、簡易機能です。バックアップにはなりません。バックアップは、あらかじめ『burdock』とは別の手段で実行しておいてください。

UI活用_テキストエディタによる編集作業

コマンドの編集は、テキストエディタで行うことができます。

メニューからコマンドを追加し、テキストエディタで修正する、といった使い方も可能です。細かい文字入力などは、テキストエディタで行うと楽でしょう。

UI活用_テキストエディタでコマンドの並び替え

UIは、コマンドを必ず末尾に追加します。

途中に挿入したり、順番を入れ替える項目は、メニューにありません。

これらの操作をするときは、テキストエディタで編集します。エディタでコマンドの行を入れ替えれば、実行順番も入れ替わります。

メニュー機能でコマンドの削除は可能ですが、テキストエディタで編集して削除しても構いません。


UI活用_テキストエディタの併用


テキストエディタの常時起動

UIメニューからエディタを起動すると、毎回、編集するたびにエディタを起動、終了しなければなりません。

これはUIメニューからコマンドを変更し、エディタからも変更してしまった、という衝突を避ける点では安全ですが、面倒です。

端末メニューとテキストエディタでの同時編集はできませんが、エディタの常時起動は可能です。

GUI環境なら、端末エミュレータテキストエディタを同時に起動できます。多機能なエディタには、ファイルの変更を検知して、再読込する機能がついています。このようなエディタを使うならば、UIメニューから起動しなくても、エディタで直接に「CMD_MEMORY_TMP.txt」を開きっぱなしにしても構いません。

編集前にエディタ側で再読込をしてから、編集して、上書き保存します。UI側で何も入力せずにEnterすると、変更が反映されます。

もし、テキストファイルが変更され、かつ、UI側でもコマンド変更が行われたならば、UI側の決定が優先されます。

シェル配列変数とテキストファイルの関係(仕組みの説明)

UIスクリプトは、Coreに与える引数の文字列を、シェル配列変数で保持しています。UIはこの配列に対して操作を行います。

UIは、シェル配列変数を編集すると、「CMD_MEMORY_TMP.txt」に書き込みます。つまり、ファイルの内容は配列変数と同一に保たれます。

UI選択メニューから「テキストエディタ」を実行すると、エディタは「CMD_MEMORY_TMP.txt」を開きます。これをエディタで編集、エディタを終了すると、UIは「CMD_MEMORY_TMP.txt」の変更を検知します。

変更を検知すると、UIは、「CMD_MEMORY_TMP.txt」を読み込み、シェル配列変数にコピーします。


UI活用_テキストエディタでファイル名を編集



  1. リネームしたいファイルを作業ディレクトリに置き、通常起動する。
  2. 「DBに予想名をSAVE」を実行。「ファイルの名前のみ」をテキストファイルに書き出す。ファイル名は「NAME」とでもしておく。
  3. 好みのツールで、「NAME」テキストファイルを編集し、リネームしたいファイル名に書き換える。行の順番がファイルの順番と同じになっている。改行を削ったり、行を入れ替えたりしないように注意。
  4. 「burdockUI」の作業に戻る。「DBをLOAD」を実行し、「NAME」ファイルを読み込む。
  5. 「burdockCore」への命令を追加する。「動作切替 → 『--once』」「動作切替 → 『--database』」「CMD任意入力 → 『echo "${NAME}"』」
  6. よければ、リネーム実行。


UI活用_犬

初期設定では「z」キーに登録されている「犬」は、いわゆるアンドゥに近い機能です。

ファイル名のリネームそのものはアンドゥしませんが、リネームコマンドの変更を1つ前に戻すことができます。

「リネーム実行」後はリネームコマンドが消去されますが、このときも犬は消去前のコマンドを覚えています。同じリネーム作業を何度か繰り返し実行したいときにも、犬に戻してもらうと便利です。



UI活用_ソートロック



ファイルの処理順序は、通常はファイルをサーチしているコマンドが決めています。デフォルトでは「ls -i -A」です。「sort切り替え」でコマンドのオプションを変えると、表示順が変わります。



「burdockUI」は、この表示と同じ順番で、リネーム等の処理を実行します。

さて、大抵は、ソート順序を決めてからリネームを実行するわけですが、リネームが複数回になると、リネームの途中でソート順序が変わることがあります。lsコマンドは名前で並び替えているのだから、当然です。



不自然な例なんですが、頭に「日記」「仕事」と付けて、さらに末尾に通し番号の連番を付加したい、とします。もし「日記」「仕事」を先につけてしまうと、これがソートに影響を与えます。



このとき役に立つのが、ソートロック機能です。希望のソートを選択してから、「ソートロック」を実行します。作業途中でもソートが変わらず、連番も見た目の順番通りに付加されます。



「INODE_ORDER_TMP.txt」ファイル

ソートロック機能は、「INODE_ORDER_TMP.txt」ファイルにi-node番号を書き込み、このファイルの順番に従うことで実現しています。ソートするコマンドを切り替えられないように固定しているから、ではありません。

非推奨ですが、「INODE_ORDER_TMP.txt」ファイルをテキストエディタで直接に編集すると、任意の順番で処理することも可能です。

個別にファイルをリネームしたい

リネーム作業の途中に、「burdock」を起動したまま、ファイラーやmvコマンドで、ファイルをリネームすることも可能です。ソートロックしておくと、リネームしても順番が維持されます。

このとき、i-node番号が変更されると、「burdock」は自動でリセットしてしまいます。が、それだけだといえばそれだけです。

アプリケーションによっては、リネームや上書きセーブでもi-node番号が変わります。普段使いのリネームツールがi-node番号を維持するか変更するか、あらかじめ試験しておくと安心です。


UI活用_ファイルビューアにWebブラウザを使う



「HTML」を実行すると、HTMLファイルにファイル一覧表を出力します。端末に表示しているものと同じ情報を、ファイル数が多くなっても省略せずに表示します。

初期設定では「FILE_VIEW_HTML.html」が出力先です。ユーザが手動で直接にWebブラウザで開いて閲覧します。

UI活用_ファイル名に使える文字を制限する

「ARROW_CHAR.txt」ファイルに文字を書き込むと、書き込んだ文字のみリネーム時に使えるようになります。ファイルが空っぽなら、文字を制限しません。


ARROW_CHAR_FILE="${1}"

# 許可文字から改行を削除して準備
XX=`tr -d "\n" 0< "${ARROW_CHAR_FILE}"`

# 許可文字が空っぽなら全て許可
if test -z "${XX}" ; then
exit 0
# 許可文字に無い文字があればgrepに引っかかる
elif grep --color=always -e "[^${XX}]" ; then
exit 1
fi

grepコマンドでヒットしなければリネーム禁止、という処理をしています。上記のように「[]」で囲っていますので、「[」「]」を許可するなら、「ARROW_CHAR.txt」の冒頭に「][」の並び順で置いてください。



UI活用_テンプレートのコマンド

Coreの機能を、UIから実行できます。簡易説明書が表示されます。

詳細は、スクリプトのソースを直接に読んでください。

プリフィックス[_prefix]
文字列の頭に任意の文字列を追加する。
サフィックス[_suffix]
文字列の後に任意の文字列を追加する。
名前クリア[_cls]
全削除する。標準入力を無視し、標準出力に文字を出力しません。入力行数を維持して、空行を出力します。
単純な「echo」でも代用は可能です。
簡易連番[_fake_seq]

連番を、簡単に指定できます。

桁数維持機能

10個のファイルに「00」を指定したならば、末尾に「00,01,02 … 07,08,09」と追加します。

10個のファイルに「95」を指定すると、「095,096,097, … 102,103,104」を付加します。

このように、入力された数値の桁数を維持して連番を作成するが、ファイル数が多くて桁数が足りないときは、自動で桁数を増やし、全体の桁数を揃えて、連番を付加します。

追加文字列 判別機能

連番の左側の文字列を追加文字列と見なし、連番と同時に付加します。「image_001」と指定すると、「image_001,image_002,image_003,…」が付加されます。

連番の前に固定文字列を追加する手間を省くことができます。

汎用連番 [_fake_nseq]

汎用の連番機能です。簡易連番が持つ文字列追加機能はありませんが、桁数維持機能は持ちます。加えて、以下の機能に対応します。

連番増減値指定

簡易連番では「01,02,03,...」のみですが、「00,03,06,09,...」や「10,09,08,...」の連番作成が可能です。

連番挿入位置指定

簡易連番では右端、末尾指定のみですが、左右から数えた任意の文字数の座標に挿入できます。

進数指定

10進数以外にも、16進数や8進数でも連番を作成できます。正確には、bcコマンドで10進数と単純変換できる進数に対応します。

小文字へ、大文字へ
「tr A-Z a-z」「tr a-z A-Z」そのものです。一般的すぎるのでCoreにも入れていません。
zipで無難[_safe_zip]
いわゆる半角英数字のみを残し、日本語文字などは削除します。zipファイル内部での、文字化け予防です。
超無難[_safe_super]
アルファベット、アラビア数字、アンダースコア、ハイフンのみ残します。特別な意味を持ちかねない役物の多くを消去します。
数字と区切り[_num_only]
「超無難」よりさらにアルファベットを削り、「012_345-678」の形式に整えます。
数字とアンダースコア、ハイフンのみを残します。さらに先頭と末尾のアンダースコア、ハイフンも消します。
全角英数->半角[_to_half_alpha]
全角英数字を半角英数字に変換します。役物も半角へ変換します。
半角カナ->全角[_to_full_katakana]
半角カタカナを全角カタカナに変換します。半角の役物も全角に変換します。
レガシー日本語文字セット[_safe_legacy_jp]

過去にしばしば問題になった、いわゆる「機種依存文字」を排除した日本語文字セットです。シフトJISのうち、無難な文字セットのみ残し、他の文字は削除します。

作りに工夫はありません。sedに大量の日本語文字が詰め込まれているだけです。

区切り文字で削除[_sep_del]
「000_111_222_333」といった文字列を、「000_222_333」へ変換します。
区切り文字で挿入[_sep_ins]

「000_111_222_333」といった文字列に、指定した文字を挿入して「000_111_AAA_222_333」へ変換します。区切り文字も自動で追加されます。

文字数で削除[_count_del]
先頭(左)、末尾(右)から文字列を数えて、指定された文字数を保存し、それ以外を削除します。「右から3文字を残して他は削除」「左を3文字右を5文字残し、間は削除」などが可能です。
文字数で挿入[_count_ins]
指定された文字列を、左右から文字数を数えた位置に挿入します。「区切り文字で挿入」とは異なり、指定文字列以外は挿入しません。
制御コード削除[_ctrl_del]
ASCII文字のうち、目に見えない文字、制御コードに該当する文字を、削除します。代表的なものは水平タブです。ただし改行文字には対応しません。
コード0x01?0x1f,0x7fが該当します。