おしえて欲しいのですが、

今、windowsにて
aaa----bbbb
|__cccc
|__dddd---eeee

などのフォルダがいくつもあり、
このなかで、ccccフォルダとeeeeフォルダの一部のファイルだけを上書きしないという条件をつけて
コピーをしたいのですが、バッチPGMを組むしか方法ないでしょうか。
なんかツールでできないでしょうか。

ご存知のかたよろしくお願いいたします。

回答の条件
  • 1人1回まで
  • 登録:
  • 終了:2015/11/25 09:32:42
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:a-kuma3 No.2

回答回数4973ベストアンサー獲得回数2154

ポイント100pt

Ant というコマンドラインベースのツールがあります。
java のビルドに使われます。
http://ant.apache.org/

色々なことができて、ファイルのコピーもその一部です。
http://www.javadrive.jp/ant/copy/index2.html
↑リファレンスよりは、ちょっと読みやすいはず。


質問の文面だとインデントが崩れてますが、ディレクトリの階層はこんな感じでしょうか。

aaa
 ├ bbbb
 ├ cccc
 └ dddd
     └ eeee

こういう構成のディレクトリから、

  • aaa ディレクトリの親ディレクトリをカレントとして、同じ階層にある dest ディレクトリにコピーする
  • aaa/cccc はコピーしない
  • aaa/dddd 配下の特定のファイル(名前やパターンの指定)はコピーしない

という場合、以下のようなビルドファイルを用意して ant を実行します。。

<?xml version="1.0" encoding="Shift_JIS"?>

<project name="my_project" default="do_copy">

  <target name="do_copy">
    <copy todir="./dest">
      <fileset dir="./aaa">
        <!-- とりあえず、全てのファイルをコピー対象 -->
        <include name="**/*" />

        <!-- そのうち、コピーしないものを個別に指定 -->
        <exclude name="cccc/**/*" />
        <exclude name="dddd/eeee/not_copy_no1.txt" />
        <exclude name="dddd/eeee/not_copy_no2.log" />
        <exclude name="dddd/eeee/*.bak" />
      </fileset>
    </copy>
  </target>

</project>

面倒そうな感じがする分、指定は細かくできます。
プログラムを書くよりは、ちょっとは楽です。
Windows でも Linux 系でも行けます。もちろん、Mac も。


対象外にする条件というのが、それほど複雑でなければ rsync とか FastCopy や robocopy という方法もあるかも。
rsync は、Windows で動かすところまでもってくのが面倒。
FastCopy や robocopy は、Windows 限定というところをどう考えるかだと思います。

id:sinrabanshyo

いつもご回答ありがとうございます。
Apacheでできるんですね。。
ありがとうございました。

2015/11/25 09:41:50
id:a-kuma3

Apache のプロジェクトのひとつですが、Webサーバとして Apache を立ち上げていない環境でも、単独のツールとして使えます。
Ant は java で実装されているので、JRE (java runtime) の導入は必要ですが、java が実行できる環境であれば OS を選びません。
# ビルドファイルの表現は、多少変わるでしょうけれど。

2015/11/25 09:54:10

その他の回答1件)

id:hissssa No.1

回答回数428ベストアンサー獲得回数129

その「上書きしたくない一部のファイル」は、具体的にどのような条件をつけて指定したいのでしょうか?また、この処理は1回だけ行うのでしょうか、それとも定期的に行うのでしょうか?。そのあたりが分からないと、適切な回答は困難かと思われます。

上書きしたくないファイルが限定されており、なおかつ1回だけ行うなら、単純に「そのファイルを一旦退避しておき、全体を上書きコピーした後に書き戻す」ようにすれば終わりかと。
あるいは、上書きしたくないファイルだけを読み取り専用属性にしてから全体コピーするという手も考えられますが。

他1件のコメントを見る
id:hissssa

すいませんが、そのご説明でも、具体的にどうしたいのかが全く分かりません
「上書きしたくないファイル、フォルダ」というのは、個別に一つ一つGUIで設定したいということですか?
またその設定は恒久的な物ですか?それともコピーを行う度に変動するのですか?
「ファイルパスは都度かわる」というのは、コピー元とコピー先の双方が変わるのですか?

と言うか、要件定義できていないようですので、要件を並べるより「どういう事情でそれをしたいのか」を具体的に説明される方が話が早いのではないかと思われますが。

2015/11/24 17:15:53
id:sinrabanshyo

環境を説明すべきでした。
ご回答いただいたのに申し訳ありませんでした。
よろしくお願いいたします。

2015/11/25 09:34:02
id:a-kuma3 No.2

回答回数4973ベストアンサー獲得回数2154ここでベストアンサー

ポイント100pt

Ant というコマンドラインベースのツールがあります。
java のビルドに使われます。
http://ant.apache.org/

色々なことができて、ファイルのコピーもその一部です。
http://www.javadrive.jp/ant/copy/index2.html
↑リファレンスよりは、ちょっと読みやすいはず。


質問の文面だとインデントが崩れてますが、ディレクトリの階層はこんな感じでしょうか。

aaa
 ├ bbbb
 ├ cccc
 └ dddd
     └ eeee

こういう構成のディレクトリから、

  • aaa ディレクトリの親ディレクトリをカレントとして、同じ階層にある dest ディレクトリにコピーする
  • aaa/cccc はコピーしない
  • aaa/dddd 配下の特定のファイル(名前やパターンの指定)はコピーしない

という場合、以下のようなビルドファイルを用意して ant を実行します。。

<?xml version="1.0" encoding="Shift_JIS"?>

<project name="my_project" default="do_copy">

  <target name="do_copy">
    <copy todir="./dest">
      <fileset dir="./aaa">
        <!-- とりあえず、全てのファイルをコピー対象 -->
        <include name="**/*" />

        <!-- そのうち、コピーしないものを個別に指定 -->
        <exclude name="cccc/**/*" />
        <exclude name="dddd/eeee/not_copy_no1.txt" />
        <exclude name="dddd/eeee/not_copy_no2.log" />
        <exclude name="dddd/eeee/*.bak" />
      </fileset>
    </copy>
  </target>

</project>

面倒そうな感じがする分、指定は細かくできます。
プログラムを書くよりは、ちょっとは楽です。
Windows でも Linux 系でも行けます。もちろん、Mac も。


対象外にする条件というのが、それほど複雑でなければ rsync とか FastCopy や robocopy という方法もあるかも。
rsync は、Windows で動かすところまでもってくのが面倒。
FastCopy や robocopy は、Windows 限定というところをどう考えるかだと思います。

id:sinrabanshyo

いつもご回答ありがとうございます。
Apacheでできるんですね。。
ありがとうございました。

2015/11/25 09:41:50
id:a-kuma3

Apache のプロジェクトのひとつですが、Webサーバとして Apache を立ち上げていない環境でも、単独のツールとして使えます。
Ant は java で実装されているので、JRE (java runtime) の導入は必要ですが、java が実行できる環境であれば OS を選びません。
# ビルドファイルの表現は、多少変わるでしょうけれど。

2015/11/25 09:54:10

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません