J'ai copié un fichier du dossier source dans le dossier de destination en utilisant la ligne de commande ci-dessous dans le terminal.
sudo cp From_SOURCE/* To_DESTINATION/
Maintenant, je veux annuler cette commande.
command-line
cp
αғsнιη
la source
la source
From_SOURCE/*
et de les supprimerTo_DESTINATION/
; cela pourrait être fait avec bash - les problèmes ici pourraient inclure la commande cp écrasé tout, les liens symboliques ont été copiés, les fichiers avec des espaces dans les noms, etc. - donc cela pourrait avoir des problèmes et devenir un peu farfelus. Une option d'annulation parfaite pourrait avoir à prendre en compte beaucoup de choses.Réponses:
Si je comprends bien, voici le cas:
Le script ci-dessous regarde dans le répertoire d'origine (source) et répertorie ces fichiers. Il examine ensuite le répertoire dans lequel vous avez copié les fichiers et supprime uniquement les fichiers répertoriés, tels qu'ils existent dans le répertoire source.
L'
try
élément est ajouté pour éviter les erreurs, par exemple au cas où vous auriez déjà supprimé certains fichiers manuellement ou si tous les fichiers du répertoire source n'ont pas été copiés vers la destination. Si vous avez besoin des privilèges sudo, exécutez simplement le script avec "sudo" (voir ci-dessous).Le script
Comment utiliser
reverse.py
,Exécutez-le par la commande:
avertissement
Essayez d'abord un répertoire de test si j'ai bien compris ce que vous devez réaliser!
Si le répertoire d'origine est "plat"
Dans le cas où le répertoire source n'a pas de sous-répertoires, le script peut même être plus simple:
Remarque
Si l'action de copie écrase (remplace) un fichier portant le même nom dans la destination, le fichier sera supprimé, mais le fichier d'origine ne sera (bien sûr) pas restauré par le script. L'hypothèse est qu'il n'y a pas de conflits de noms.
la source
sudo python3 reverse.py
. J'accepte ta réponse.cp
.cp -r
. J'ai changéos.remove
avecprint
, et il génère un tas de fichiers qui n'existent pas. Je suppose qu'il manque les sous-répertoires et ne répertorie que les fichiers à la fin.TL; DR:
Tous les fichiers qui sont présents dans les deux
src
etdest
peuvent être supprimésdest
comme ceci: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
Pour comprendre comment annuler,
sudo
n'est pas pertinent.Je vais utiliser les noms de répertoire
src
pourFrom_SOURCE
etdest
pourTo_DESTINATION
.Maintenant, notre commande est:
Si
src
contient les fichiersf1
,f2
etf3
, et les répertoiresd1
etd2
, le shell étend cette commande à:Sans options telles que
-r
,-R
ou-a
, la commandecp
ne copie pas les répertoires.Cela signifie que la commande les laissera de côté, affichant une erreur pour chacun d'eux:
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 danssrc
. 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
danssrc
, car cela rend lesfind
commandes suivantes beaucoup plus simples, et définissons une variable sur le chemin absolu de dest:Ensuite, nous listons tous les fichiers dans src:
et, pour chaque fichier trouvé, utilisez
cmp
pour vérifier s'il existe un fichier avec le même contenu dans dest: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:
Cela semble bon! Maintenant, nous pouvons laisser de côté
echo
pour exécuter les vraiesmv
commandes:Tous les fichiers
dest
qui ont été copiéssrc
et qui sont toujours les mêmes danssrc
etdest
, 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 aliascp -i
ou qui aurait empêché l'écrasement des fichiers en demandant d'abord.la source
C'est vieux, mais je voulais juste poster une réponse bash pure:
Accédez d'abord au répertoire dans lequel vous avez copié les fichiers.
cd dest
Ensuite,
ls
le répertoire source et dirigez la sortie versrm
ls source | xargs rm
la source
ls
est généralement une mauvaise idée. mywiki.wooledge.org/ParsingLs Je ne revoterai pas votre message, mais il faut le noter.