2つのディレクトリをコピー/マージし、2つのファイルの名前が同じ場合は、古いディレクトリの名前を変更して変更時間を追加する方法

2つのディレクトリをコピー/マージし、2つのファイルの名前が同じ場合は、古いディレクトリの名前を変更して変更時間を追加する方法

ほとんどの名前は同じですが異なるファイルを含む複数のディレクトリがあり、これらのディレクトリをすべて新しいディレクトリにマージする必要があります。同じ名前のファイルを比較し、同じ場合は無視/上書きするか、別の場合は変更された日付/時刻をファイル名に追加して古いファイルの移動/名前を変更できる必要があります。

詳細と@Serhat Cevikelと@Wildcardアドレスを追加するには:データは同じ構造を持つ2つのドライブに保存され、考慮する必要があるサブフォルダがあるため少し複雑です。以下は、私が作成したテスト環境のツリーといくつかの説明です。

/bmrlbackup/drive1/
`-- user001
    `-- directory1
        `-- project001
            |-- file000           #identical
            |-- file001           #older same name
            |-- file0011          #unique
            |-- phase1
            |   |-- file000       #identical
            |   |-- file110       #unique
            |   |-- file999       #newer same name
            |   `-- phase11
            |       `-- file111   #unique
            `-- phase2
                `-- file120       #unique
/bmrlbackup/drive2/
`-- user002
    `-- directory2
        `-- project001
            |-- file000           #identical
            |-- file001           #newer same name
            |-- file0012          #unique
            |-- phase1
            |   |-- file000       #identical
            |   |-- file210       #unique
            |   `-- file999       #older same name
            `-- phase2
                |-- file220       #unique
                `-- phase21
                    `-- file221   #unique

最初のrsyncの出力:

#rsync -a --ignore-existing --remove-source-files $sd1/ $dd1/
project001/
project001/file0011
project001/phase1/
project001/phase1/file110
project001/phase1/phase11/
project001/phase1/phase11/file111
project001/phase2/
project001/phase2/file120

サブディレクトリを一覧表示するようにremm(残りの「同じ」ファイル)を変更しました。

#remm=`ls -1 $(find $sd1/ -type f)`
/bmrlbackup/drive1/user001/directory1/project001/file000
/bmrlbackup/drive1/user001/directory1/project001/file001
/bmrlbackup/drive1/user001/directory1/project001/phase1/file000
/bmrlbackup/drive1/user001/directory1/project001/phase1/file999

ここに2つのファイルがあります。

/bmrlbackup/drive1/user001/directory1/project001/file000 
/bmrlbackup/drive1/user001/directory1/project001/phase1/file000

どちらの場所も同じで、コピーする必要はなく、移動してターゲットを上書きできます。

名前は同じですが、内容が異なるファイル:

/bmrlbackup/drive1/user001/directory1/project001/file001
/bmrlbackup/drive1/user001/directory1/project001/phase1/file999

「名前は同じですが、内容は異なります」ファイルを比較し、古いファイルの名前を変更する必要があります。編集日時を追加する必要があります。したがって、ソースが最新の場合はターゲットファイルの名前を追加し、ソースが古い場合はソースを移動します。その後、ソース名を追加し、追加のソース名を移動します。

このプロセスの結果、最終的にすべてのファイルがドライブ1からドライブ2に移動されます。

次に、最も古い=`{$ sd1、$ dd1}のすべてのエラーを見つけます...

提案?

各ドライブには、4kから800Mのサイズのファイルが10,000個以下に制限されています。

答え1

私の記憶が正しい場合は、ファイル名が異なる場合はファイルをmv、ファイル名が同じ場合は古いファイルの名前を変更し、モードの日付/時刻を追加してからmvを追加することを意味します。スクリプトは次のとおりです。最初のパラメータはソースパス、2番目のパラメータはターゲットパスです。パスの末尾にスラッシュを追加しないでください。

(更新:「ls」は「find」に置き換えられました。これは、lsを解析せずに複数のパスにあるファイルを日付で並べ替える2つの目的を提供します。変数置換自体がより簡潔になりました。)ワイルドカードとスペースと「:」は両方ともスペースで置き換えます)

#!/bin/bash

sd1=$1
dd1=$2


rsync -a --ignore-existing --remove-source-files $sd1/ $dd1/
remm=`ls $sd1`

for i in $remm
do
    oldest=`find {$sd1,$dd1} -type f -name $i -printf "%T@ %p\n" | sort -n | head -1 | cut -d " " -f2`
    appendd=`stat $oldest --printf=%y\n | sed 's/ +.*//g' | sed 's/[ :]/_/g'`
    newname="${oldest}_$appendd"
    mv $oldest $newname
done

rsync -a --ignore-existing --remove-source-files $sd1/ $dd1/

関連情報