[前の記事]« バッチの中で数秒間スリープさせたい
[次の記事][NT系]名前に日付を付けたフォルダを削除するには »

関連オンラインソフト配布サイト:
Vector>ダウンロード(top) |>MS-DOSまたは汎用 | >WindowsVista/XP/2000/NT

▲カテゴリー「COPY,XCOPY…ファイルやディスクの複写・連結・バックアップ」索引へ

[WIN95/98]「指定した文字列が名前に含まれるフォルダ」をバッチ処理でコピーしたい


946) 任意のフォルダのコピー方法 たか 2002/11/28(木) 18:03


こんにちは。
バッチプログラムで、任意の文字列が含まれるフォルダを
コピーしたいのですが、どうしても方法が分かりません。

例:"C:\DIR1"配下の「hoge」という文字列が含まれるフォルダを
  サブフォルダを含め全て"C:\DIR2"にコピー

環境はWin95/98です。
何かいい方法が有りましたら、お教えください。
よろしくお願いします。

947) Re:任意のフォルダのコピー方法 じゃく 2002/11/28(木) 18:42


こんにちは
>バッチプログラムで、任意の文字列が含まれるフォルダを
>コピーしたいのですが、どうしても方法が分かりません。
「任意の文字列が含まれるフォルダをコピー」という表現が
 意図するところは次のどれでしょう?
 ・指定する文字列がフォルダ名に含まれるフォルダ
 ・指定する文字列がファイル名に含まれているファイルが
  入っているフォルダ
 
 また、コピーするのは、フォルダのみ?中にあるファイルも
 コピーするのですか?

 このあたりが明確でないと、回答がかけないと思います。


>例:"C:\DIR1"配下の「hoge」という文字列が含まれるフォルダを
>  サブフォルダを含め全て"C:\DIR2"にコピー

>環境はWin95/98です。
>何かいい方法が有りましたら、お教えください。
>よろしくお願いします。

948) Re2:任意のフォルダのコピー方法 たか 2002/11/28(木) 19:06


たかです。よろしくお願いします。

> 「任意の文字列が含まれるフォルダをコピー」という表現が
> 意図するところは次のどれでしょう?
> ・指定する文字列がフォルダ名に含まれるフォルダ
> ・指定する文字列がファイル名に含まれているファイルが
>  入っているフォルダ

「指定する文字列がフォルダ名に含まれるフォルダ」です。
 
> また、コピーするのは、フォルダのみ?中にあるファイルも
> コピーするのですか?

中にあるフォルダ及びファイルを全てコピーしたいと思っています。

> このあたりが明確でないと、回答がかけないと思います。

ご指摘ありがとうございます。以後注意します。

>>
>>例:"C:\DIR1"配下の「hoge」という文字列が含まれるフォルダを
>>  サブフォルダを含め全て"C:\DIR2"にコピー
>>
>>環境はWin95/98です。
>>何かいい方法が有りましたら、お教えください。
>>よろしくお願いします。

949) Re3:任意のフォルダのコピー方法 じゃく 2002/11/28(木) 20:26


たかさん、こんにちは。

>「指定する文字列がフォルダ名に含まれるフォルダ」です。
> 
>> また、コピーするのは、フォルダのみ?中にあるファイルも
>> コピーするのですか?

>中にあるフォルダ及びファイルを全てコピーしたいと思っています。

整理しますと、指定した文字列を含むフォルダ名があれば、
 フォルダの中身を含めてコピーする。
 サブフォルダを含めて該当するフォルダをコピーしたいと
 いうことは、文字列が該当しない途中(※)のフォルダは
 空でコピーするということですよね。
 例)指定する文字列 hoge 、すべてのフォルダにファイルがある

c:\--DIR1-+-hoge001--tmp
        +-aaaaa---phoge--hogehoge

    ↓バッチでコピー

 c:\ --DIR1-+-hoge001--tmp
  |     +-aaaaa---phoge--hogehoge
  |     +-aaaab---phoge--hooge
 |
  +--DIR2-+-hoge001
        +-aaaaa★---phoge--hogehoge
        +-aaaab★---phoge

 ★印のフォルダは空


>ご指摘ありがとうございます。以後注意します。

なんか説教くさかったですか、すみません。
 明確になったので方法をこれから考えます(^^;;;
 XCOPYを使えばできそうなのですが、95系のオプションだけで
 可能なのか考えてみます。
 念のため伺いますが c:\DIR1 以下を C:\DIR2 に全てコピー
 して、該当しないフォルダを消すという方法は不可ですか?

>>>
>>>例:"C:\DIR1"配下の「hoge」という文字列が含まれるフォルダを
>>>  サブフォルダを含め全て"C:\DIR2"にコピー
>>>
>>>環境はWin95/98です。
>>>何かいい方法が有りましたら、お教えください。
>>>よろしくお願いします。

951) Re4:任意のフォルダのコピー方法 たか 2002/11/29(金) 10:59


じゃくさん、こんにちは。

> 整理しますと、指定した文字列を含むフォルダ名があれば、
> フォルダの中身を含めてコピーする。
> サブフォルダを含めて該当するフォルダをコピーしたいと
> いうことは、文字列が該当しない途中(※)のフォルダは
> 空でコピーするということですよね。

すみません、またまた説明不足でした・・・m(_ _)m

フォルダ名を検索しようと思うのは、あるフォルダの直下の階層の
フォルダのみでOKです。
また文字列がフォルダ名の先頭にあるものだけでOKです。
え~と・・・図にしてみます。

(例)C:\DIR1直下のフォルダで「hoge」という文字列がフォルダ名
   の先頭にあるフォルダをサブフォルダ(空フォルダも含む)、
   ファイル全てをコピー

C:\-DIR1-+-hoge-+-file01
     |   +-dirA-file02
     |   +-dirB
     +-aaa -+-file
         +-hogep-+-file03

       ↓バッチでコピー

C:\-+-DIR1-+-hoge-+-file01
  |    |   +-dirA-file02
  |    |   +-dirB
  |    +-aaa-+-file03
  |       +-phoge-+-file04
  +-DIR2-+-hoge-+-file01
          +-dirA-file02
          +-dirB

> 念のため伺いますが c:\DIR1 以下を C:\DIR2 に全てコピー
> して、該当しないフォルダを消すという方法は不可ですか?

該当しないフォルダの容量が大きい為、不可なんです。

以上、よろしくお願いします。

953) Re5:任意のフォルダのコピー方法 じゃく 2002/11/29(金) 20:47


たかさん、こんにちは。
>フォルダ名を検索しようと思うのは、あるフォルダの直下の階層の
>フォルダのみでOKです。
>また文字列がフォルダ名の先頭にあるものだけでOKです。
>え~と・・・図にしてみます。

>(例)C:\DIR1直下のフォルダで「hoge」という文字列がフォルダ名
>   の先頭にあるフォルダをサブフォルダ(空フォルダも含む)、
>   ファイル全てをコピー

>C:\-DIR1-+-hoge-+-file01
>     |   +-dirA-file02
>     |   +-dirB
>     +-aaa -+-file
>         +-hogep-+-file03

>       ↓バッチでコピー

>C:\-+-DIR1-+-hoge-+-file01
>  |    |   +-dirA-file02
>  |    |   +-dirB
>  |    +-aaa-+-file03
>  |       +-phoge-+-file04
>  +-DIR2-+-hoge-+-file01
>          +-dirA-file02
>          +-dirB
 私が示した条件より緩くなっている。良かった。
 私の示した条件では、正直できるかなぁ?という感じでした。
 今回のたかさんの条件だと、すぐに思いつくのが、
 xcopy /s /e c:\DIR1\hoge* c:\DIR2\
 なのですが、これだと、DIR1のなかに hoge.exe や hoge.txt
 などのファイルがあった場合これもコピーします。
 やっぱりそれはまずいですか?
 まずいようなら、もう一工夫考えます。


954) Re6:任意のフォルダのコピー方法 たか 2002/11/30(土) 13:29


じゃくさん、こんにちは。

> 私が示した条件より緩くなっている。良かった。

最初から言えって感じですよね・・・すみません。

> 私の示した条件では、正直できるかなぁ?という感じでした。
> 今回のたかさんの条件だと、すぐに思いつくのが、
> xcopy /s /e c:\DIR1\hoge* c:\DIR2\

試してみたのですが、DIR1配下の不要なフォルダまで、空フォルダと
して、コピーされてしまいます...(こういうもの?)

> なのですが、これだと、DIR1のなかに hoge.exe や hoge.txt
> などのファイルがあった場合これもコピーします。
> やっぱりそれはまずいですか?

可能な限り、必要なものだけコピーしたいと思っています。

Win2000環境でしたら、以下のようなバッチも思いついたの
ですが・・・

:HOGE.BAT
CD C:\DIR1
FOR /D %%1 IN (HOGE*) DO MD C:\DIR2\%%1
FOR /D %%1 IN (HOGE*) DO XCOPY /E %%1 C:\DIR2\%%1

> まずいようなら、もう一工夫考えます。

貴重なお時間を頂き申し訳ないのですが、よろしくお願いします。

959) Re7:任意のフォルダのコピー方法 じゃく 2002/12/02(月) 10:16


たかさん、こんにちは。

>> 私の示した条件では、正直できるかなぁ?という感じでした。
>> 今回のたかさんの条件だと、すぐに思いつくのが、
>> xcopy /s /e c:\DIR1\hoge* c:\DIR2\

>試してみたのですが、DIR1配下の不要なフォルダまで、空フォルダと
>して、コピーされてしまいます...(こういうもの?)

やっと、98Meで試してみましたが、hoge と関係ない名前のフォルダ
 も空でコピーされてしましますね。さらに、DIR1直下以外にある、
 hogeが付くファイルもすべてコピーされるようです。
 これじゃあ、いけませんな。

>Win2000環境でしたら、以下のようなバッチも思いついたの
>ですが・・・

>:HOGE.BAT
>CD C:\DIR1
>FOR /D %%1 IN (HOGE*) DO MD C:\DIR2\%%1
>FOR /D %%1 IN (HOGE*) DO XCOPY /E %%1 C:\DIR2\%%1

そうですね。xcopy にせよ、for にせよ、hoge*としたとき
 フォルダ名は対象からはずれているようです。
 (だから for /d のオプションが拡張されたんでしょうね。)

>> まずいようなら、もう一工夫考えます。

>貴重なお時間を頂き申し訳ないのですが、よろしくお願いします。

 考えましたが、どうもうまくいきません。
 dir /b /a:d hoge* で該当するフォルダ名は取り出せましたが、
 このフォルダ名をバッチにうまく渡す方法が思いつきません。
 95/98の標準コマンドの組み合わせで、いい方法が見つかりません。
 sed や awk などのテキスト整形ツールを組み合わせれば、
 できますが、私にはそれくらいしか思いつきません。
 期待させてすみません。


962) Re8:任意のフォルダのコピー方法 たか 2002/12/02(月) 19:52


じゃくさん、こんにちは。

> 考えましたが、どうもうまくいきません。
> dir /b /a:d hoge* で該当するフォルダ名は取り出せましたが、
> このフォルダ名をバッチにうまく渡す方法が思いつきません。
> 95/98の標準コマンドの組み合わせで、いい方法が見つかりません。
> sed や awk などのテキスト整形ツールを組み合わせれば、
> できますが、私にはそれくらいしか思いつきません。
> 期待させてすみません。

とんでもござません。
いろいろとありがとうございました。

sed や awkというのをご紹介頂きましたので、
入手して試してみます。

うまくできましたら、ご報告させて頂きます。
それでは。

965) Re9:任意のフォルダのコピー方法 vampire 2002/12/03(火) 17:52


たかさん、じゃくさん、こんにちは。
お二人のやりとりを読ませていただきました。DOSの標準コマンドでは難しそうですね。

フリーソフトを使うということでよければ、以下のようなソフトで実現が可能です。
ただし、これから御紹介するソフトはロングファイルネーム非対応です。(^^;;

使用フリーソフト
 find.exe (find314.lzh) => xfind.exeにリネーム t.k.氏作成
 cp.exe (cpmv032.lzh) North氏作成
 izgrep (izgrep.lzh) iz(泉博志)氏作成

* find.exeはDOSのfindコマンドとバッティングするので、ここではxfind.exeとリネームすることとします。

たかさんの条件は次のとおりと理解しました(OKですか?)
【条件】
C:\DIR1ディレクトリー直下にあるHOGExxxという名称のディレクトリーと当該ディレクトリー中のファイル(名称は問わない)、及びそのサブ ディレクトリー(名称は問わない)と当該ディレクトリー中のファイル(名称は問わない)をC:\DIR2ディレクトリー下へディレクトリー構造を維持しな がら複写する。
HOGExxxのサブディレクトリーのうち、空のディレクトリーも複写する。

【方法】
 xfind_ c:/ -type d -p | izgrep c:/dir1/hoge(.)* > copy.src
 md c:\dir2
 cp -r @copy.src /dir2

以上で完了です。

【説明】
コマンド中の"/"は"\"と同義です。

●xfindコマンド(検索)
 まず、Cドライブのディレクトリー名称を全部リストアップします。
 c:/ Cドライブのルートディレクトリー以下を対象とするという意味
 -type d 処理の対象はディレクトリーという意味
 -p ディレクトリー名称をフルパスで出力せよという意味(c:/dir1/hoge1の形式)

●izgrepコマンド(文字列抽出)
 xfindの出力から"c:/dir1/hoge"の文字列を含む行をcopy.srcにリダイレクトします。
 なお、c:/dir1/hoge(.)*は
  c:/dir1/hoge
  c:/dir1/hoge1
  c:/dir1/hogexyz
などにマッチします。

 DOSのfindコマンドでも代用可能かと思います。(find "c:/dir1/hoge")

 copy.srcは以下のような内容で出力されます。
  c:/dir1/hoge1
  c:/dir1/hoge1/dir_a
  c:/dir1/hoge1/dir_b
  c:/dir1/hoge2

●mdコマンド
 あらかじめ、c:\dir2を作成しておきます(必須)。

●cpコマンド(コピー)
 ディレクトリーとファイルを複写します。
 @copy.srcはこのcopy.srcファイルをレスポンスファイルとして扱えという意味。これにより、copy.srcの内容が転送元として処理される。
 転送先の/dir2はあらかじめ作成しておくこと(作成しておかないとエラーになってしまう)。
 -r 再帰的な複写を行うという意味。ディレクトリー構造をcpに作成させる場合必須。

【ソフト】
使用したソフトは前述のとおりで、これらは「MS-DOSフリーソフトTOOLS 基本セット40」(発行 株式会社アスキー)に添付されていたものです。たぶんアスキーネットなどで入手が可能なのではないかと思います。
これらはいずれもUnixライクツールです。他にも同様な機能を有するソフトはたくさん出回っていると思いますので(LFN対応のものもあるでしょう)、捜してみてください。

【確認OS】
Windows95,MS-DOS(ver.5.0AH)

以上、参考になれば幸いです。

966) Re10:任意のフォルダのコピー方法 じゃく 2002/12/04(水) 08:09


vampireさん、たかさん、こんにちは。

>お二人のやりとりを読ませていただきました。DOSの標準コマンドでは難しそうですね。
フリーソフトのご紹介ありがとうございました。
 2000/XP系は標準コマンドも充実していてやりやすいのですが、
 95/98系はなかなか難しいですね。

 たかさんには sed や awk をご紹介しましたが、これも結構
 むずかしそうなので、マイクロソフトおすすめのWSHを使った
 例を考えてみました。
 Win95のマシンでは、WSHがインストールされていない可能性が
 ありますので、コマンドラインで cscript と入力してヘルプ
 が表示されたらインストールされています。

 バッチ xxcopy.bat と WSHの xxcopy.vbs を c:\DIR1 に
 コピーして xxcopy を実行します。
 xxcopy.vbs は テキストファイルの各行の改行をなくして、
 空白で区切った1行にまとめてファイルに出力するだけを
 担当してもらってます。

== xxcopy.bat ====================================

echo off
if "%1"=="next" goto loop
cd C:\DIR1
echo %0 next >tmp.txt
dir /b /a:d hoge* >>tmp.txt
cscript //NoLogo xxcopy.vbs
copysub.bat
:loop
shift
if "%1"=="" goto end
md c:\DIR2\%1
xcopy /e %1 c:\DIR2\%1\
goto loop
:end


== xxcopy.vbs ====================================
'このスクリプトは以下のページを参考にしました。
'http://www.roy.hi-ho.ne.jp/mutaguchi/wsh/index.html

Set Fs = WScript.CreateObject("Scripting.FileSystemObject")

Set oTs1 = Fs.OpenTextFile("tmp.txt",1) 'ファイルを読み取りモードで開く
Set oTs2 = Fs.CreateTextFile("copysub.bat",True) 'ファイルを作成する

Do Until oTs1.AtEndOfStream 'oTs1を末端まで読み込むまでループを繰り返す
sLine = oTs1.ReadLine '1行読み込む
oTs2.Write sLine & " " 'oTs2にその行の内容と空白を出力(改行なし)
Loop

oTs2.Write vbCrLaf '改行を出力

oTs1.Close 'oTs1を閉じる
oTs2.Close 'oTs2を閉じる




993) 【解決】Re11:任意のフォルダのコピー方法 たか 2002/12/07(土) 17:44


じゃくさん、vampireさん こんにちは。
ご報告遅くなり申し訳ありませんでした。

お二人には、具体的な方法をお教え頂き、本当に感謝しております。
結果は、じゃくさんのWSHを使用した方法で、無事解決する事が
できました。

本当にありがとうございました。
 
 


カテゴリー「COPY,XCOPY…ファイルやディスクの複写・連結・バックアップ」索引へ

 

カテゴリー一覧

FPCU/FPCDIY QUICK LINK online
この上の各ジャンル名をクリックすると、下のウィンドウが切り替わります▼


=リンク集のインデックスはこちら=

資料書籍

About

2002年11月28日 09:06に投稿されたエントリーのページです。

ひとつ前の投稿は「バッチの中で数秒間スリープさせたい」です。

次の投稿は「[NT系]名前に日付を付けたフォルダを削除するには」です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。

This site is powered by Six Apart
Movable Type 3.33-ja
このブログについて | 運営:有限会社メディアポート