
Linuxには、次の構造の2つのディレクトリimageとimage2があります。
/images/ad
/images/fe
/images/foo
...およびその他の4000フォルダ
もう一つはこんな感じです。
/images2/ad
/images2/fe
/images2/foo
...およびその他の4000フォルダ
これらの各フォルダには画像が含まれており、画像と画像2の下のディレクトリは同じ名前ですが内容は異なります。次に、すべての4000フォルダについて、/images2/adのイメージをImages/adに、/images2/fooをImages/fooにコピーしてマージする方法を知りたいです。
答え1
これは仕事です。同期。ファイルをコピーする代わりにファイルを移動したくない限り、シェルループを使用して手動でこれを行うことには利点はありません。
rsync -a /path/to/source/ /path/to/destination
あなたの場合:
rsync -a /images2/ /images/
(の末尾のスラッシュに注意してくださいimages2
。そうでない場合はコピーされます/images/images2
。)
上記のコマンドは、同じ名前のイメージが両方のディレクトリに存在する場合は/images/SOMEPATH/SOMEFILE
上書きされます/images2/SOMEPATH/SOMEFILE
。古いファイルのみを置き換えるには、オプションを追加してください-u
。常にこのバージョンを維持するには、/images
このオプションを追加してください--ignore-existing
。
rsyncを使用してファイルを移動するには、/images2
オプションを渡すことができます--remove-source-files
。その後、rsync はすべてのファイルを順番にコピーし、完了すると各ファイルを削除します。これは、ソースディレクトリとターゲットディレクトリが同じファイルシステムにある場合に移動するよりもはるかに遅くなります。
答え2
すでに投稿したとおり、最良のオプションはもちろんですrsync
。unison
通常、ソフトウェアパッケージをインストールする必要がありますが、作業に適したソフトウェアです。どちらもさまざまなオペレーティングシステムで使用できます。
同期
rsync はソースからターゲットへ一方向に同期します。したがって、次の文
rsync -avh --progress Source Destination
すべてを同期源泉到着目的地。マージされたフォルダは次の場所にあります。目的地。
-ㅏ「アーカイブ」を意味し、オリジナルからターゲットまですべてを繰り返しコピーし、ほぼすべてを保存します。
-Vより多くの出力(「verbose」)を提供します。
- 時間人間の読みやすさのために。
- 進展どのくらいの作業が完了したかを示します。
欲しいなら修正するこれ目的地フォルダ最新にソースフォルダのファイル:
rsync -avhu --progress source destination
調和
unison は双方向に同期されます。したがって、次の文は
unison Source Destination
最終ソースがターゲットと同じになるように、両方のディレクトリを双方向に同期します。これは、ソースからターゲットへ、またはその逆にrsyncを2回実行するのと同じです。
より高度な使い方については、マニュアルページまたは次のWebサイトを参照してください。
答え3
ディレクトリが次の--link
場合、オプションを使用して両方のディレクトリをマージするより高速でスペース効率の良い方法があります。cp
同じファイルシステムで、関連記事のいくつかの答えで説明されています。 (記事のタイトルがユーザーの質問と正確に一致しないため、回答はユーザーの実際の問題を解決するのではなく、タイトルのトピックであるマージの問題に対処しています。)
オプションは、ファイルデータをコピーしないことを--link
意味します。その中のすべての項目が前の項目を置き換えるcp
場合を例に挙げます。/images2
/images
cp --force --archive --update --link /images2/. /images
にマージした/images
後rm -rf /images2
/images2/x
ファイルツリーのマージのどこでも、ディレクトリを同じ名前の既存のファイルまたはシンボリックリンクにマージしようとする場合、つまり指定されたディレクトリを同じ名前の既存のファイルやシンボリックリンクにマージせず、/images/x
Forエラーが発生した場合ファイルまたはシンボリックリンクを手動で削除し、コマンドを再実行できます。
利点は、--link
ディレクトリをマージするためにデータが移動されないことです。
答え4
for dir in images2/*; do mv "$dir"/* "images/$(basename "$dir")"; done
拡張globを使用してすべての項目を繰り返し、images2
(解析の問題を回避するためにls
)mv
その項目の内容をの一致する項目に追加しますimages
。ワイルドカードパスから先行文字を削除するために使用されますbasename
。images2