一致するフォルダ名をスキップして2つのディレクトリの内容をマージする方法は?

一致するフォルダ名をスキップして2つのディレクトリの内容をマージする方法は?

次の内容を含むポータブルディスクがあります。

/media/usb1/CBCradio3/1.wav
/media/usb1/CBCradio3/2.wav
/media/usb1/CBCradio3/3.wav
/media/usb1/CBCradio3/4.wav
/media/usb1/podcasts/1.wav
/media/usb1/podcasts/2.wav
/media/usb1/podcasts/3.wav

次の内容を含むハードドライブもあります。

/home/user/Music/CBCradio3/2.wav
/home/user/Music/CBCradio3/3.wav
/home/user/Music/radio12/1.wav
/home/user/Music/radio12/2.wav

データをコピーしたいのですが、中にフォルダ名が/Music/既に存在する場合は無視してください。

つまり、フォルダに混在したデータが含まれたくありません。通常のコピーを使用してドライブをコピーすると、次の結果が得られます。

/home/user/Music/CBCradio3/1.wav <--added to folder
/home/user/Music/CBCradio3/2.wav
/home/user/Music/CBCradio3/3.wav
/home/user/Music/CBCradio3/4.wav <--added to folder
/home/user/Music/podcasts/1.wav <--added whole folder
/home/user/Music/podcasts/2.wav <--added whole folder
/home/user/Music/podcasts/3.wav <--added whole folder
/home/user/Music/radio12/1.wav
/home/user/Music/radio12/2.wav

しかし、コンテンツをマージしたくありません。フォルダがある場合は、コンテンツのコピーをスキップする必要があります。この目標をどのように達成できますか?

  • コピーしようとしましたが、フォルダの内容がマージされましたmcthunar
  • 次のディレクトリには.../usb1/追加のサブディレクトリは含まれていません。

ベストアンサー1

あなたの説明によると、これは再帰的な問題ではありません。fooソースとターゲットの両方に存在する場合、fooストーリーの終わりにはコピーされません。したがって、単純なシェルループでこの問題を解決できます。

source=/media/usb1
destination=/home/user/Music
test -d "$destination" || mkdir -- "$destination"
for x in "$source"/*; do
  if ! [ -e "$destination/$x" ]; then
    cp -Rdp "$x" "$destination/"
  fi
done

(ただし、この要件には問題があります。たとえば、レプリケーションが中断されると、ターゲットの一部のディレクトリだけが残り、回復する方法がないか、回復する必要がある項目を知ることもできません。)

おすすめ記事