共通の要素が多数ある2つのディレクトリツリーをマージしようとしていますが、各ディレクトリツリーには2つのツリーの1つにのみ存在する要素があります。私が経験している主な問題は、mv
同じ相対パスを持つ2つのサブディレクトリに遭遇したときにソース(with -f
)またはターゲット(with -n
)を維持しますが、2つのサブディレクトリセットの組み合わせを取得できないことです。 。もちろんrsync
withを使用することもできますが、--remove-source-files
それを行うと、実際の移動ではなく実際にデータをコピーしてから古いファイルを削除します。どちらのディレクトリツリーにも数百ギガバイトのデータが含まれており、どちらも同じパーティションにあるので、時間を節約するために可能であれば実際の移動を実行したいと思います。
これで、find * -type file -exec mv -n {} /destination/{}
ターゲットディレクトリがすでに存在する場合にのみソースからターゲットにファイルを移動します。コマンドの前にこのような接頭辞を付けることができますが、mv -n * /destination/
そうすると、最上位ディレクトリのみが表示されます。一行にする方法はありますか?ファイルをコピーする前にディレクトリが存在することを確認するスクリプトをいつでも作成できますが、これは基本的な操作のように見え、より簡単な方法が必要です。
ベストアンサー1
警告:この回答は、ハードリンク(FATなど)をサポートしていないファイルシステムには適用されません。
別のオプション(携帯性が高い)は次のとおりです。
CDソースディレクトリ 探す。 -type f -print0 | cpio --pass-through --null --link --make-directories宛先ディレクトリ
cpio
(コピーイン&アウト)は初期恐竜ですtar
。同様に、tar
アーカイブを作成したり、アーカイブから抽出したりできます。 (私が間違っている場合は修正してください)とは異なり、tar
単一のコマンドを使用してディレクトリツリーをコピーできます。 (私の考えでは、あなたがこれを行うことができるようです。)これがまさにその意味です。 「ファイル名が null で区切られると予想されます」を意味します。つまり、出力を読み取ります。これは、「可能であれば、ソースディレクトリのファイルをターゲットディレクトリにリンクします」を意味します。説明は必要ありません。tar -cf - source option(s) and arguments(s) | tar -xf - destination option(s) and arguments(s)
--pass-through
--null
find … -print0
--link
--make-directories
これは省略できます。必要に応じて、またはを追加してください。cpio –p0ld dest_dir
--verbose
-v
さて、これがすべて終わった後、
- 競合を確認し、適切に対処してください。
- ターゲットディレクトリがハードリンクでいっぱいになっていることを確認してください。
- ソースディレクトリを削除します。