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個のフォルダすべてをコピーマージする方法を知りたいです。
これは 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 -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サイトを参照してください。
for dir in images2/*; do mv "$dir"/* "images/$(basename "$dir")"; done
展開されたグロブを使用してimages2
のすべてのコンテンツをループし(ls
の解析に関する問題を回避するため)、次にmv
images
。 basename
を使用して、先頭のimages2
をグローブパスから削除します。
@ inulinux12では、コマンドラインから次の1行のfor
ループを使用できます。
$ for dir in images2/*; do mv "$dir"/* "${dir/2/}"; done
これにより、すべてのファイルがimages2
〜images
それぞれのディレクトリにあります。注:これは、同じ名前のファイルがないことを前提としています。
例えば:
実行前:
$ 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