Unix pour rechercher des fichiers pdf à partir d’une liste dans un fichier texte

J’ai un répertoire (pour Endnote) qui est rempli de fichiers PDF (1000 d’entre eux). J’ai utilisé Unix pour imprimer une liste de tous les fichiers pdf et enregistré cette liste sous forme de fichier texte. La plupart de ces fichiers pdf se trouvent dans d’autres répertoires de mon ordinateur (en double).

Maintenant, je veux utiliser la commande find pour rechercher les doublons de ces fichiers pdf sur le rest de mon ordinateur et si un doublon est trouvé, déplacez-le dans un nouveau répertoire. Si un nom de fichier spécifique est trouvé plus d’une fois, je souhaite donner à chacun un nom unique (par exemple, basename.pdf.1, basename.pdf.2, etc.). A la fin, je veux un seul répertoire pour tous les doublons, donc je peux les vérifier, puis les supprimer).

Cependant, je ne veux pas chercher à rechercher le répertoire dans lequel ma liste a été créée ou mon Dropbox, car je ne veux pas déplacer ces fichiers pdf (ne déplacez que les autres fichiers PDF dispersés dans mon ordinateur).

J’ai trouvé (je pense) comment faire toutes les étapes individuelles dont j’ai besoin pour accomplir cette tâche, mais je n’arrive pas à tout rassembler dans une commande Unix qui fonctionne.

1) Pour trouver des fichiers en excluant un répertoire:

find -name "what to search for" -not -path "excluded_directory" 

ou

 find build -not \( -path excluded_directory1 -prune \) -not \( -path excluded_directory2 -prune \) -name \*.what_to_find 

ou mon favori actuel

 find . -name '*.what_to_find' | grep -v exludeddir1 | grep -v excludeddir2 

2) Pour lire un fichier texte dans find et utiliser les lignes comme motifs de recherche:

 find . type f -print | fgrep -f file_list.txt 

3) pour trouver et déplacer des fichiers

 find / -iname "*.what_to_find" -type f -exec mv {} /new_directory \; 

ou

 find / -iname "*.what_to_find" -type f | xargs -I '{}' /new_directory 

ou (pour renommer des fichiers, les fichiers portant le même nom ne sont pas simplement écrasés). Je n’ai pas encore tout compris dans cette commande …

 find -name '*.what_to_find' -type f -exec bash -c 'mv -v "$0" "./$( mktemp "$( basename "$0" ).XXX" )"' '{}' \; 

Donc, je peux exécuter ces commandes individuellement, mais je n’ai pas réussi à les faire fonctionner ensemble comme je le souhaitais (peut-être que mon ordre de commandes est erroné, d’autres problèmes?).

 find . type f -print | fgrep -f file_list.txt | grep -v excludeddir1 | grep -v excludeddir2 -exec bash -c 'echo mv -v "$0" "./$( mktemp "$( basename "$0" ).XXX" )"' '{}' \; 

Toute aide est très appréciée! Merci Derrick

Eh bien, je n’ai pas pu accomplir cette tâche exactement comme je le souhaitais, mais j’ai trouvé un travail autour duquel le travail était fait.

J’ai imprimé une liste de tous les fichiers PDF que j’ai dans Endnote, puis j’ai supprimé le nom du chemin, ne laissant que les noms de fichiers (trouver et remplacer la fonction dans text wrangler). J’ai ensuite utilisé la commande find pour rechercher cette liste sur mon ordinateur, en imprimant toutes les occurrences de chaque PDF.

Ensuite, dans text wrangler, j’ai supprimé toutes les lignes contenant le chemin initial vers mes fichiers PDF de fin de notes, ne laissant que les doublons souhaités.

Ensuite, j’ai utilisé la commande find pour rechercher ces chemins exacts et les déplacer dans un nouveau dossier.

Tout compte fait, je me suis débrouillé avec exactement les mêmes commandes que j’ai dans mon post original, et un peu d’aide de text wrangler. Malheureusement, je n’ai jamais compris comment combiner toutes les étapes souhaitées en une seule commande Unix.