元のファイルを別のフォルダに残したままファイルをコピーするバッチ ファイル

元のファイルを別のフォルダに残したままファイルをコピーするバッチ ファイル

たとえば、次のようなフォルダがあります:

F1\F11\some files...
F1\F12\some files...
F1\F12\F121\some files..

そしてもう一つの構造があります

F2\F21\some files...
F2\F22\some files...
F2\F22\folder\some files...

フォルダーの名前F11- F21F12および はF22同じです。

フォルダー にはF21F22よりもファイルが少なくなりますF11F12

F2再帰的にコピーする必要がありますF1が、置き換えられるファイルはバックアップ フォルダーに保存する必要があります。

Fbackup\F11\those files..
Fbackup\F12\those files..

これは、そのコピーの「元に戻す」アクションを実行できるようにするために必要です。たとえば、再帰的F2にコピーしてF1から、Fbackup を にコピーし、F1元の を作成しますF1

答え1

Unix シェルの使用に抵抗がない場合は、bashまたは独自の C シェルを使用したいくつかの代替手段を以下に示します。

Cシェルソリューション

次のようにすればいいでしょうハミルトンCシェル、 含んでいる無料版:

cd F2
foreach i (...\*)
   if ( -f $i ) then
      if ( -e F1\$i ) cp F1\$i Fbackup\$i
      cp $i F1\$i
   end
end

表記...不定ディレクトリワイルドカード0以上のディレクトリレベルにマッチし、パターンの残りの部分がマッチするために必要なもの。 ディレクトリツリー...\*内のすべてのファイルまたはディレクトリにマッチします。F2-eオペレーター存在をテストし、-f演算子はファイルをテストします。

このコード フラグメントは、問題となる隠しファイルやディレクトリが存在しないことを前提としています。また、 内のすべてのディレクトリ (すべてのファイルではない場合でも) が および に既に存在していることも前提としていF2ますF1Fbackup

隠しファイルやディレクトリの欠落を考慮する必要がある場合は、次のように設定します。 nonohidden = 1そしてmkdir不足しているディレクトリ:

cd F2
@ nonohidden = 1
foreach i (...\*)
   if ( -f $i ) then
      if ( -e F1\$i ) then
         if ( ! -e Fbackup\$i:h ) mkdir -r Fbackup\$i:h
         cp F1\$i Fbackup\$i
      end
      if ( ! -e F1\$i:h ) mkdir -r F1\$i:h
      cp $i F1\$i
   end
end

bash解決

ご希望の場合はシグウィン bash、ディレクトリをツリーウォークするには、ワイルドカードfindの代わりにを使用する必要があります。その解決策は次のようになります。(私は専門家ではないので、これを改善できる可能性があります。)...F2bash

まず、スクリプトを作成し、次のように呼び出しますbackupscript.sh:

#!/usr/bin/bash
if [ -f "$@" ]; then
   if [ -e F1/"$@" ]; then
      cp F1/"$@" Fbackup/"$@"
   fi
   head=$(dirname "$@")
   if [ ! -e F1/"$head" ]; then
      mkdir -p F1/"$head"
   fi
   cp "$@" F1/"$@"
end

次に、次のように実行します。

cd F2
find . -type f  | xargs -I "{}" bash -c "backupscript.sh {}"

関連情報