J'ai un répertoire avec plus de 1000 fichiers. Dans un fichier texte, j'ai environ 50 noms de fichiers, un par ligne. Je voudrais supprimer tous les fichiers du répertoire dont les noms de fichiers ne correspondent pas à une entrée de la liste. Quelle est la meilleure façon de procéder ? J'ai lancé un script shell, mais je n'ai pas pu déterminer la commande appropriée à déterminer dans le nom de fichier dans la liste. Merci.
Réponse acceptée :
Je me rends compte que toute question demandant comment supprimer des fichiers doit être prise avec beaucoup de soin.
Ma première réponse était trop hâtive, je n'ai pas pris le fait que la liste de fichiers pouvait être mal formée pour être utilisée avec egrep. J'ai modifié la réponse pour réduire ce risque.
Cela devrait fonctionner pour les fichiers qui n'ont pas d'espace dans le nom :
Reconstruisez d'abord votre liste de fichiers pour vous assurer que le nom de fichier correspond exactement :
sed -e 's,^,^,' -e 's,$,$,' filelist > newfilelist
construire les commandes rm
cd your_directory
ls | egrep -vf newfilelist | xargs -n 1 echo rm > rmscript
Vérifiez si le script rm vous convient (Vous pouvez le faire avec « vim » ou « less »).
Effectuez ensuite l'action :
sh -x rmscript
Si les fichiers ont des espaces dans leur nom (si les fichiers ont le "
dans le nom alors cela ne fonctionnera pas) :
ls | egrep -vf newfilelist | sed 's,^(.*)$,rm "1",' > rmscript
bien sûr la liste de fichiers ne doit pas être dans le même répertoire !
MODIFIÉ :
La liste des fichiers de Nathan contenait des noms qui correspondaient à tous les fichiers du répertoire (comme "html" correspond à "bob.html"). Donc rien n'a été supprimé car egrep -vf
absorbé tout le courant. J'ai ajouté une commande pour mettre un "^" et un "$" autour de chaque nom de fichier. J'ai eu de la chance ici que la liste de fichiers de Nathan soit correcte. Aurait-il été formaté en DOS avec des lignes terminées par CR-LF ou avec des espaces supplémentaires, aucun fichier n'aurait été conservé par l'egrep et tous auraient été supprimés.