TL; DR:
Tous les fichiers qui sont présents dans les deux srcet destpeuvent être supprimés destcomme ceci:
find . -maxdepth 1 -type f -exec cmp -s '{}' "$destdir/{}" \; -exec mv -n "$destdir/{}" "$toDelete"/ \;
Pour une explication étape par étape, voir ci-dessous.
Simplifier le problème:
Pour comprendre ce que la commande que nous voulons annuler a réellement fait, nous commençons par la simplifier:
La commande que nous voulons annuler est
sudo cp From_SOURCE/* To_DESTINATION/
Pour comprendre comment annuler, sudon'est pas pertinent.
Je vais utiliser les noms de répertoire srcpour From_SOURCEet destpour To_DESTINATION.
Maintenant, notre commande est:
cp src/* dest/
Si srccontient les fichiers f1, f2et f3, et les répertoires d1et d2, le shell étend cette commande à:
cp src/f1 src/f2 src/f3 src/d1 src/d2 dest/
Sans options telles que -r, -Rou -a, la commande cpne copie pas les répertoires.
Cela signifie que la commande les laissera de côté, affichant une erreur pour chacun d'eux:
$ cp src/f1 src/f2 src/f3 src/d1 src/d2 dest/
cp: omitting directory 'src/d1'
cp: omitting directory 'src/d2'
Cela signifie que nous n'avons copié que des fichiers simples et aucun répertoire dest.
Décider quels fichiers supprimer:
Il y avait peut-être des fichiers destdu même nom que des fichiers dans src. Dans ce cas, les fichiers ont été écrasés (1). Il est trop tard pour eux, désolé. Récupérez-les à partir de la dernière sauvegarde.
En ce qui concerne les fichiers qui s'y trouvent, nous voulons supprimer uniquement les fichiers qui ont été copiés. Ces fichiers existent dans les deux répertoires, avec le même nom et le même contenu.
Nous recherchons donc ces fichiers:
Tout d'abord, nous allons cddans src, car cela rend les findcommandes suivantes beaucoup plus simples, et définissons une variable sur le chemin absolu de dest:
$ cd src
$ destdir="$(readlink -f dest)"
Ensuite, nous listons tous les fichiers dans src:
$ find . -maxdepth 1 -type f
et, pour chaque fichier trouvé, utilisez cmppour vérifier s'il existe un fichier avec le même contenu dans dest:
$ find . -maxdepth 1 -type f -exec cmp -s '{}' "$destdir/{}" \; -print
Suppression des fichiers, soigneusement:
Ces fichiers sont ceux que nous voulons supprimer. Mais pour être sûr, nous les déplaçons d'abord dans un répertoire différent - et examinons les commandes avant de les exécuter:
$ 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/`
Cela semble bon! Maintenant, nous pouvons laisser de côté echopour exécuter les vraies mvcommandes:
find . -maxdepth 1 -type f -exec cmp -s '{}' "$destdir/{}" \; -exec mv -n "$destdir/{}" "$toDelete"/ \;
Tous les fichiers destqui ont été copiés srcet qui sont toujours les mêmes dans srcet dest, sont maintenant dans /tmp/toDelete/et peuvent être supprimés après un dernier examen.
Remarques:
(1) Vérifiez s'il cps'agit d'un alias cp -iou qui aurait empêché l'écrasement des fichiers en demandant d'abord.