Supprimer les files d'un directory qui se trouvent également dans un autre directory

J'ai copié un directory en utilisant ceci:

cp -r dir/ ../../ 

sans réfléchir et réalisé qu'il a copié le contenu de dir au lieu de réellement dir dans le directory ci-dessus. Maintenant, j'ai un désordre de files que j'ai besoin de supprimer afin que je puisse refaire le cp correctement. Comment puis-je supprimer tous les files que j'ai copiés par erreur s'ils ne correspondent à rien en particulier?

Ok, c'est fondamentalement la même chose que la réponse de Klapaucius . (Et il ne réparera pas les dommages causés si cp a écrasé certains files existants.)

En supposant que vous êtes dans le directory source (dans dir ). Cette command:

 find . -type f echo '{}' ';' 

-print tous les files (récursivement) présents dans votre directory dir (tout comme -print ). L'option -type f est là pour empêcher la list des sous-directorys.

Donc, si vous utilisez:

 find dir -type f -exec echo '../../../{}' ';' 

Cela devrait listr les files correspondants (copys) dans le directory cible.

Maintenant, si la list est correcte, vous pourrez supprimer les copys en utilisant:

 find dir -type f -exec rm -- '../../../{}' ';' 

Quant à l'élagage des directorys vides restants qui viennent de la cp … hum …

Utilisez find en combinaison avec -exec . Mieux tester avec ls avant comme ça:

 find . -name "*" -exec ls ../../{} \; 

Le code suivant gère les noms de files qui contiennent des newlines incorporés J'ai mis un script de version complète sur paste.ubuntu . Il vérifie l'existence et les tailles correspondantes … Le code pour générer datatables de test y est également inclus.

 # This lists the original fully-qualified filename, # and its would-be counterpart (assuming it exists) unset ai while IFS= read -r -d $'\0' relf; do printf "%s\n$s" "$PWD${relf:1}" "$(dirname "$(dirname "$PWD")")${relf:1}" done < <(find . -type f \! -name '.' -name '*' -print0) 

Voici un exemple de sortie de la version complète (mentionné ci-dessus), où un file est manquant, et un autre a une taille de file différente de l'original

 WARNING ----- NOT in target ./file1 ok -------- sizes match ./c/file4-in-subdir WARNING ------ size mis-match ./file3 is sortingple-spaced ok -------- sizes match ./file2 has newline!