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
ます。エイリアスであると、最初に確認することでファイルの上書きを防ぐことができます。