ファイル名を名前順に並べ替えて連結するためのバッチ (for DOS, Win95 DOS窓) s-adtxt.bat rev.3 written by Seiji Fujita http://userweb.alles.or.jp/sfujita/ ------------------------------------------------------------------------- 【概要】 複数のテキストファイルを一つにまとめたい場合、DOSあるいはWin95のDOS窓で、 copy foo_*.* newtxt.txt などとすれば、連結する事は可能です。 しかし、思った通りの順番で連結されるかどうかは分かりません。一般に連結は FATに登録された順番(DOSまたはDOS窓でソートオプション無しにdirコマンドを 使った時の順番)に連結されます[*1][*2]。 DOSのツールであるフリーウェアの FDや FILMTNなどのファイラを用いて、対象 ファイルや対象ファイルを含んだディレクトリ内のファイル全てを名前順にソー トして、FATを書き替えてからならば上記のようなcopyコマンドでも順番に連結 できますが、Win95上のVFATに未対応のツールを用いて直接FATをいじるのは危険 が伴います。 [*1]もちろん、copy foo_1.txt + foo_2.txt + … + foo_n.txt newtxt.txt   あるいは、type foo_1.txt > newtxt.txt        type foo_2.txt >> newtxt.txt            :        type foo_n.txt >> newtxt.txt   のようにすれば、並べた順番(あるいは実行した順番)に連結できます。   並べるファイルが5個程度ならこれでもよいのですが、この方法で50や100   もあるファイルを並べるのは(少なくとも手動では)大変です。 [*2]後で知った事ですが、Unix like toolsなどの catコマンドを用いて、     cat *.txt > allfile.txt   のようにすると、入力に指定されたファイルの名前順で連結されるようです。   CATのオンラインマニュアルを読んでも、順番に並ぶなどの説明が見つから   ないのですが、動作を見る限り並べ替えてくれる仕様のようです。   ということで、cat.exeがあればこのバッチは不要です。   名前順と書きましたが、下で述べる【諸注意】3と同じ状況で並びますので、   ちゃんと並べたい時は、数値のゼロプレフィックスなどが必要です。 このバッチは、危険を伴うFATの書き換えやハードウェアへの直接アクセスを行な わずに名前順にファイルを連結するためのものです。全ての作業をDOSの command.comを通して行ないますので、FATの不整合などの障害は起こりません。 動作原理は単純で、並べ替え対象となるテキストファイル名のリストを sort コマンドで並べ替えたあと、以下に示す要領でリストの順番にファイルを連結 しているだけです。  [連結概念フロー]  type nul > NewFile ……… 新規ファイル作成  type File1 >> NewFile …… 1番目のファイルを新規ファイルの後部に連結  type File2 >> NewFile …… 2番目のファイルを新規ファイルの後部に連結    :               : type FileN >> NewFile …… N番目のファイルを新規ファイルの後部に連結 これはつまり、先に[*1]で示した後者の方法を自動化している訳です。 [*1]で示したどちらの方法も、全てを手動で行なうのは大変ですが、一部をバッ チで行なえば作業が軽減できますので、  「dirコマンドでディレクトリのリストをファイルに取り、エディタで不要  なファイル名を除去しつつ、必要なファイルを順番に目的ファイルに連結す  るバッチを書き、それを実行する」 という一連の作業を実施されている方も割といらっしゃると思います。 でも、私はその作業さえ面倒に感じたので、バッチで自動化しました。 ※この原理上、元のテキストファイルにファイルの終端を示す文字 EOF(Enf Of  File; コード自体は SUB;^Z;$1A などとも表現されます)が含まれている場  合は、それ以降の文字が連結されませんのでご注意下さい。  EOFコードやその他の一部コントロールコードは多くのテキスト処理(sedで  の置換も含む)で動作の障害となりますので、不要なコントロールコードを  取り除くツールであらかじめ除去しておく必要があります。  DOS用のフリーウェアとして zdel.exe, tconv.exe, ctrldel.exe などがあり  ますので、入手されるとこのバッチの前処理に限らず重宝すると思います。 並べ替える元のファイルは FOO_0501.TXT, FOO_0502.TXT〜 FOO_0531.TXTの様に、 前半に共通分があり後半が異なる数字/文字であるファイル名とします。 ファイルの先頭に共通文字を持たないファイルを連結することには対応していま せん。 【事前設定】 添付されたバッチファイルは環境変数を2つ利用しています。 バッチを書き変えずに利用される場合には、それらを autoexec.bat 中などで 設定しておいて下さい。 ●環境変数 %batdir% は、s-adtxt.bat及び sedスクリプトを置くディレクトリ  set batdir=c:\usr\bat のように設定する。 ●環境変数 %wrk% は、作業ディレクトリ  set wrk=f:\tmp などと設定する。最後に\を付けないこと(×例 f:\tmp\)。 ●sed (外部コマンドファイル)を用意して下さい。  このバッチでは sed を使っています。幾つかの sed が持つ方言は用いてい  ませんので、基本的なものであればなんでも構いません(但し、日本語ファ  イル名も扱うのならば、日本語対応版の sed を用いた方がよいでしょう)。 ●sort(外部コマンドファイル)を用意して下さい。  通常は、DOSやWin95には標準添付されていますので、削除などをしていなけ  れば気にしなくて構いません。また、特別な並べ替えオプションは利用して  いませんので、フリーウェアなどの同等品であっても構いません。  pathの通った場所においてあれば結構です。 【使い方】 s-adtxt.bat 入力ディレクトリ 入力ファイル名の共通部 出力ファイル  具体例: (※パラメータ無しでバッチを実行させても同様の説明が出ます)  ・A:\FOO_05*.TXTを a:\FOO_M05.TXTへ連結する場合    s-adtxt A: FOO_05 a:\FOO_M05.TXT  ・カレントディレクトリの FOO_05*.TXTを a:\FOO_M05.TXTへ連結する場合    s-adtxt . FOO_05 FOO_M05.TXT  ・A:\LOG\FOO_05*.TXTを B:\FOO_M05.TXTへ連結する場合    s-adtxt A:\LOG FOO_05 B:\FOO_M05.TXT  ※出力ファイル名が、ワイルドカードで表現される入力ファイル名の範疇に   含まれていてはいけません。   例えば A:\BB\CC05*.TXT→A:\BB\CC05.TXTの連結は駄目です。 【諸注意】 1:入力ファイル名は空白を含まないこととします。仮にWin95で空白文字を   ファイル名に加えた場合、DOS窓では「空白の手前までの文字+~数字.拡張子」   のような名前として扱われます。   例:Win95上で、foo bar.txt と名付けられたファイルは、     dos窓では foo~1.txt などとしてアクセスする必要があります。 2:現状のバッチでは、拡張子が TXT、txt だけのファイルを並べ替え対象として   扱います。但し、出力先の拡張子には制限がありません(TXT以外であっても、   拡張子がなくても構いません)。 3:ファイル名の共通部以外の部分はゼロプレフィックスするなどしてください   (例:1でなく01など)。   例えば、FOO_05xx.TXT の xx部分がプレフィックスされている場合とそうでない   場合では以下のようになります。   プレフィックスなし→ sortした際に 051, 0511, 0512, 052, 053 …と並ぶ。   プレフィックスあり→ sortした際に 0501, 0502, 0503, 0511, 0512 …と並ぶ。 【補足】 このバッチは、選択に用いるコマンド batkey.com を用いて記述されていますが、 代わりに win95に付属のchoice.comを使う事もできます。 choiceの場合は以下のように変更してください。 s-adtxt.batから、以下の範囲(A)を削除し、(B)を貼り付けて下さい。 ※windows95のインストール先が c:\windows以外の場合は書き換えをお忘れなく。 (A) -------------------------------------------------------------------- :KEYIN echo 出力ファイル[%3]が既に存在しますので、 echo 入力ファイルを出力ファイルの末尾に連結します。 batkey.com 1 このまま変換作業を続けますか (Y/N)? echo . if errorlevel 255 goto MSG3 if errorlevel 0 goto PROCESS --------------------------------------------------------------------              ↓ (B)          ↓ -------------------------------------------------------------------- :KEYIN echo 出力ファイル[%3]が既に存在しますので、 echo 入力ファイルを出力ファイルの末尾に連結します。 echo 変換作業を続けますか c:\windows\command\choice.com echo . if errorlevel 2 goto MSG3 if errorlevel 1 goto PROCESS if errorlevel 0 goto KEYIN -------------------------------------------------------------------- choice以外の同様な機能を持つ選択コマンドであっても構いません。 その場合は、置換える選択コマンドの用法に従って書き変えて下さい。 【履歴】  rev.0〜1 NIFTY SERVEの、とある PATIOで saddtxt.batとして公開  rev.2 grepとsedを併用していたバッチを sed だけで済むように変更。  rev.3 Web上で公開。名称を s-adtxt.bat に変更。