TL; DR:
Tous les fichiers qui sont présents dans les deux src
et dest
peuvent être supprimés dest
comme 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, sudo
n'est pas pertinent.
Je vais utiliser les noms de répertoire src
pour From_SOURCE
et dest
pour To_DESTINATION
.
Maintenant, notre commande est:
cp src/* dest/
Si src
contient les fichiers f1
, f2
et f3
, et les répertoires d1
et d2
, le shell étend cette commande à:
cp src/f1 src/f2 src/f3 src/d1 src/d2 dest/
Sans options telles que -r
, -R
ou -a
, la commande cp
ne 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 dest
du 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 cd
dans src
, car cela rend les find
commandes 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 cmp
pour 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é echo
pour exécuter les vraies mv
commandes:
find . -maxdepth 1 -type f -exec cmp -s '{}' "$destdir/{}" \; -exec mv -n "$destdir/{}" "$toDelete"/ \;
Tous les fichiers dest
qui ont été copiés src
et qui sont toujours les mêmes dans src
et dest
, sont maintenant dans /tmp/toDelete/
et peuvent être supprimés après un dernier examen.
Remarques:
(1) Vérifiez s'il cp
s'agit d'un alias cp -i
ou qui aurait empêché l'écrasement des fichiers en demandant d'abord.