@troglodytes525 (A H)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

robocopy? 同期するファイルを別のフォルダにもコピーしたい

Q&A

Closed

フォルダ①:同期元
 ファイルA,B,C
フォルダ②:同期先
 ファイルA
フォルダ③:作業フォルダ
 空

フォルダ①からフォルダ②へ同期する際、ファイルBがコピーされるはずなので、同時にフォルダ③へファイルBをコピーしたいです。

きっと簡単な事なのかもしれませんが、午前中を使って解決できませんでした。
どなたかご教授いただければ幸いです。

0 likes

4Answer

今までの返信からの仕様を考えると

  1. フォルダ①とフォルダ②の差分(増分)を検出する
  2. フォルダ①とフォルダ②を同期する(robocopy)
  3. フォルダ②(またはフォルダ①)からフォルダ③へ1で検出したファイルをコピーする(robocopy不可)

といった手順でやらないとダメじゃないかと思います。

2Like

Comments

  1. コメント追えなさそうなので、一旦削除しました。
    batの完成楽しみにしています。
  2. @troglodytes525

    Questioner

    @hitorigotsuさん、@gx3n-inueさん、@mrbonjinさん、何度もコメントありがとうございます。
    @mrbonjinさんに整理して頂いた手順に沿って、batを完成させることが出来ました。
    (ファイル名に全角不可という条件付きですが)

    差分のログファイルの中にタブとスペースが含まれるので、(1)ファイル名の時点でスペースをアンダーバーに変換、sedでタブとスペースを削除&ディレクトリ情報を削除、の作業を追加しました。

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

    @echo off

    set "source=C:\Users\a-hoshino\Desktop\①"
    set "destination=C:\Users\a-hoshino\Desktop\②"
    set "work=C:\Users\a-hoshino\Desktop\③"

    setlocal enabledelayedexpansion

    for %%a in ("%source%\*") do (
    set "file=%%~nxa"
    set "newname=!file: =_!"
    ren "%%a" "!newname!"
    )

    robocopy "%source%" "%destination%" /L /NJH /NJS /NDL /NS /NC /FP /NP /log:00.txt

    sed "s/[ \t]*//g" 00.txt > 01.txt

    sed "s/.*\\//" 01.txt > 02.txt

    robocopy "%source%" "%destination%" /MIR

    for /f "delims=" %%f in (02.txt) do robocopy "%source%" "%work%" "%%f"

robocopyでの差分に注目していますが、
ファイルバックアップツールによる差分の検出、に頼らなくても、

フォルダ1のまま、
更新日時(タイムスタンプ)が特定の期間内(特定の日時以降)のファイルのみ処理対象にする

もしくは、

フォルダ1内の、更新日時(タイムスタンプ)が特定の期間内(特定の日時以降)のファイルを、
作業フォルダ(フォルダ3)にコピーする

といったスクリプトを書いても良いような...

2Like

Comments

  1. @troglodytes525

    Questioner

    @gx3n-inue さん、コメントありがとうございます。
    フォルダ①に問題がありまして、「ファイル入れるの忘れてました」って言ってくれる人がいるので、タイムスタンプで追えないんです。。。

こんにちは

質問文から、フォルダ3にファイルBのみをコピーするように見えたのですが
こちらは条件が特定のファイルのみをコピーするとなっているのでしょうか?

そうであれば、下記のようなコマンドで行けるのではないかと思いました。

PS C:\>robocopy フォルダ1 フォルダ3 ファイルB

新しいファイル名のみを取得したい場合は、フォルダ構成を比較して
差分があるファイルをコピーする等が思いつきます。

例えば、下記コマンドで取得したデータをrobocopyの引数として与えるのが無難かなと思いました。(引数の確認等が必要になりそうですが、、)

PS C:\> $Target = Get-Childitem フォルダ1 -name
PS C:\> $Source = Get-Childitem フォルダ2 -name

PS C:\> $Get_diff = Compare-Object $Target $Source | Select-Object InputObject
1Like

Comments

  1. @troglodytes525

    Questioner

    @hitorigotsuさん、コメントありがとうございます。

    コピーしたいのはBとCで、条件を誤記しておりました。

    なので、次の日にフォルダ①でDが増えたら、フォルダ②と③にDをコピーしたいです。

    ただ、フォルダ③内のファイルは、作業した順に消していきたいので、同期ではなく、①⇒②の増えたファイルだけをコピーしたいと考えています。

    @echo off
    set "source=C:~~~"
    set "destination=H:~~~"
    set "work=\\~~~"

    robocopy "%source%" "%work%" /E /MIR /R:10 /W:30 /LOG+:C:\Users\00\Desktop\01.log

    for /r "%destination%" %%F in (*) do (
    if exist "%work%\%%~nxF" (
    del "%work%\%%~nxF"
    )
    )

    robocopy "%source%" "%destination%" /E /MIR /R:10 /W:30 /LOG+:C:\Users\00\Desktop\01.log

    近くまで来たとは思うのですが、for~だとフォルダ③(work)で作業を完了していない状態でも、フォルダ②(destination)にあるデータをすべて削除してしまうので、悩んでいます。
  2. 返信ありがとうございます。

    ほぼ完成しているのですね。
    ※後は作業の完了条件をバッチに反映させるだけように見えました。(タイムスタンプとかファイルの中身確認する等ですかね?)

話は少しそれますが、、

ちなみにファイルAって、更新されていた場合はフォルダ3にはコピーしなくて良いんですかね?

1Like

Comments

  1. @troglodytes525

    Questioner

    @gx3n-inueさん、コメントありがとうございます。
    ファイルAが更新されることはありません。
    実動作は、フォルダ①に定期的な録音データがたまっていき、フォルダ②にバックアップ、フォルダ③で作業して、終わったファイルは削除していく、という形です。
    次回の同期までに、前回の差分ファイルに対する作業が完了していて、フォルダ③が空の状態ならば、上のバッチで大丈夫だと思います。
    が、作業が終わっていなかった場合にこのバッチを動かすと、前回の差分ファイルAが消えて、当該回の差分ファイルが保存されてしまいます。


    説明書きが上手くできてなくてお恥ずかしい限りです。
  2. @troglodytes525さん
    なるほど...

    フォルダ①からフォルダ②への同期はrobocopyでやって、robocopyの実行結果は、/LOGオプションでファイル名を指定して出力できるので、

    そのログファイルを読み込んで、差分のファイル(実際にコピーされたファイル)だけフォルダ①からフォルダ③にコピーするスクリプトを、私だったら書くかなぁ。

    フォルダ③にコピーする前に、差分のファイル一覧も確認したいですし。

Your answer might help someone💌