たとえば、次のようなフォルダがあります:
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
- F21
、F12
および はF22
同じです。
フォルダー にはF21
、F22
よりもファイルが少なくなりますF11
。F12
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
ますF1
。Fbackup
隠しファイルやディレクトリの欠落を考慮する必要がある場合は、次のように設定します。
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
の代わりにを使用する必要があります。その解決策は次のようになります。(私は専門家ではないので、これを改善できる可能性があります。)...
F2
bash
まず、スクリプトを作成し、次のように呼び出します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 {}"