TL; DR:
両方に存在するすべてのファイルsrcとdestから削除することができdest、このように:
find . -maxdepth 1 -type f -exec cmp -s '{}' "$destdir/{}" \; -exec mv -n "$destdir/{}" "$toDelete"/ \;
段階的な説明については、以下を参照してください。
問題を単純化する:
取り消したいコマンドが実際に何をしたかを理解するために、単純化することから始めます。
元に戻すコマンドは
sudo cp From_SOURCE/* To_DESTINATION/
元に戻す方法を理解するには、 sudoは、関係ありません。
私は、ディレクトリ名を使用しますsrcためFrom_SOURCEとdestのためにTo_DESTINATION。
今、私たちのコマンドは次のとおりです。
cp src/* dest/
srcファイルf1、f2およびf3、およびディレクトリd1およびが含まれている場合d2、シェルはそのコマンドを次のように展開します。
cp src/f1 src/f2 src/f3 src/d1 src/d2 dest/
-r、-Rまたはなどのオプションがない-a場合、コマンドcpはディレクトリをコピーしません。
つまり、コマンドはそれらを除外し、それぞれのエラーを表示します:
$ cp src/f1 src/f2 src/f3 src/d1 src/d2 dest/
cp: omitting directory 'src/d1'
cp: omitting directory 'src/d2'
つまり、単純なファイルのみをコピーし、ディレクトリはコピーしません。 dest。
削除するファイルの決定:
のファイルdestと同じ名前のファイルがあった可能性がありますsrc。この場合、ファイルは上書きされました(1)。遅すぎてごめんなさい。最新のバックアップからそれらを取り戻します。
そこにあるファイルに関しては、コピーされたファイルのみを削除したいです。これらのファイルは、同じ名前で同じ内容の両方のディレクトリに存在します。
したがって、これらのファイルを探します。
まず、私たち cdにsrcそれが次なるため、findコマンドがはるかに簡単、とdestの絶対パスに変数を設定します。
$ cd src
$ destdir="$(readlink -f dest)"
次に、src内のすべてのファイルをリストします。
$ find . -maxdepth 1 -type f
そして、見つかったファイルごとに、 cmp、destに同じ内容のファイルがあるかどうかを確認ためします。
$ find . -maxdepth 1 -type f -exec cmp -s '{}' "$destdir/{}" \; -print
ファイルを慎重に削除します。
これらのファイルは削除したいものです。しかし、確かに、最初にそれらを別のディレクトリに移動します-そして、それらを実行する前にコマンドを見てください:
$ toDelete=/tmp/toDelete ; mkdir -p "$toDelete"
$ find . -maxdepth 1 -type f -exec cmp -s '{}' "$destdir/{}" \; -exec echo mv -n "$destdir/{}" "$toDelete"/ \;
mv -n /path/to/dest/./f1 /tmp/toDelete/`
mv -n /path/to/dest/./f2 /tmp/toDelete/`
mv -n /path/to/dest/./f3 /tmp/toDelete/`
いいね!これでecho、実際のmvコマンドを実行するために省略できます。
find . -maxdepth 1 -type f -exec cmp -s '{}' "$destdir/{}" \; -exec mv -n "$destdir/{}" "$toDelete"/ \;
からdestコピーされたすべてのファイルは、からにコピーされますがsrc、実際には、およびにあり、、srcおよびになりdest、/tmp/toDelete/最後に見てから削除できます。
注:
(1)cpエイリアスであるかどうかを確認しcp -iます。エイリアスであると、最初に確認することでファイルの上書きを防ぐことができます。