web-dev-qa-db-ja.com

2つのディレクトリをコピーしてマージする方法は?

Linuxにこの構造を持つ2つのディレクトリimagesとimages2があります。

/images/ad  
/images/fe  
/images/foo  

...と他の4000フォルダ

もう一方は次のようなものです:

/images2/ad  
/images2/fe  
/images2/foo

...と他の4000フォルダ

これらの各フォルダーには画像が含まれており、imagesとimages2の下のディレクトリの名前はまったく同じですが、内容は異なります。次に、/ images2/adの画像をimages/adに、/ images2/fooの画像をimages/fooになど、4000個のフォルダすべてをコピーマージする方法を知りたいです。

126
ssierral

これは rsync のジョブです。ファイルをコピーするのではなく移動したい場合を除いて、シェルループを使用して手動でこれを行うメリットはありません。

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はすべてのファイルを順番にコピーし、完了したら各ファイルを削除します。これは、移動元と移動先のディレクトリが同じファイルシステムにある場合、移動よりもはるかに遅くなります。

すでに投稿されているように、最良の選択はもちろんrsyncです。それにもかかわらず、ユニゾンはこの仕事をするための素晴らしいソフトウェアです。どちらもいくつかのオペレーティングシステムで使用できます。

Rsync

rsyncは、ソースから宛先への一方向で同期します。したがって、次のステートメント

rsync -avh --progress Source Destination

SourceからDestinationまですべてを同期します。マージされたフォルダはDestinationにあります。

-aは「アーカイブ」を意味し、ほぼすべてを保持しながら、すべてをソースから宛先に再帰的にコピーします。

-vは、より多くの出力( "verbose")を提供します。

-h人間が読める形式。

-progressは、実行された作業量を示します。

updateのみが必要な場合は、destinationフォルダーソースフォルダーの新しいファイル:

rsync -avhu --progress source destination

ユニゾン

unisonは両方向で同期します。したがって、次のステートメント

unison Source Destination

両方のディレクトリを両方向で同期し、最終的にソースが宛先と等しくなります。これは、ソースから宛先へ、またはその逆でrsyncを2回実行するようなものです。

より高度な使用法については、manページまたは次のWebサイトを参照してください。

  1. https://www.cis.upenn.edu/~bcpierce/unison/
  2. https://rsync.samba.org/
46
debiarch
for dir in images2/*; do mv "$dir"/* "images/$(basename "$dir")"; done

展開されたグロブを使用してimages2のすべてのコンテンツをループし(lsの解析に関する問題を回避するため)、次にmvimagesbasenameを使用して、先頭のimages2をグローブパスから削除します。

5
Etan Reisner

@ inulinux12では、コマンドラインから次の1行のforループを使用できます。

$ for dir in images2/*; do mv "$dir"/* "${dir/2/}"; done

これにより、すべてのファイルがimages2imagesそれぞれのディレクトリにあります。注:これは、同じ名前のファイルがないことを前提としています。

例えば:

実行前:

$ ls -R images*
images:
ad  adfoo  fe
images/ad:
jpg.1  jpg.2
images/adfoo:
jpg.7
images/fe:
jpg.5
images2:
ad  adfoo  fe
images2/ad:
jpg.3
images2/adfoo:
jpg.6
images2/fe:
jpg.4

実行後:

$ ls -R images*
images:
ad  adfoo  fe
images/ad:
jpg.1  jpg.2  jpg.3
images/adfoo:
jpg.6  jpg.7
images/fe:
jpg.4  jpg.5
1
Simply_Me