GNU/Linux >> Tutoriels Linux >  >> Linux

Supprimer tous les fichiers d'un répertoire dont le nom ne correspond pas à une ligne dans une liste de fichiers ?

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.


Linux
  1. Comment supprimer des fichiers et des répertoires sous Linux à partir de la ligne de commande

  2. Comment trouver un fichier sous Linux dans tous les répertoires de manière récursive

  3. Comment ouvrir ou lister tous les fichiers dont le nom correspond à deux modèles dans Bash ?

  4. Lister tous les répertoires qui n'ont pas de fichier avec un nom de fichier donné à l'intérieur ?

  5. Utilisez Rechercher pour trouver certains répertoires et supprimer tous les fichiers qu'il contient sauf un répertoire ?

Supprimer les fichiers et les répertoires par leurs noms. Aucun fichier ou répertoire de ce nom?

Comment supprimer tous les fichiers avec une extension particulière dans un dossier particulier ?

Répertorier de manière récursive tous les fichiers d'un répertoire, y compris les fichiers des répertoires de liens symboliques

Décompressez tous les fichiers dans un répertoire

commande linux pour vider tous les fichiers d'un répertoire

Supprimer tous les fichiers aléatoires sauf 1000 dans un répertoire