J'ai besoin de nettoyer un dossier périodiquement. Je reçois une liste de fichiers qui contient du texte, quels fichiers sont autorisés. Maintenant, je dois supprimer tous les fichiers qui ne sont pas dans ce fichier.
Exemple:
dont-delete.txt
:
dontdeletethisfile.txt
reallyimportantfile.txt
neverdeletethis.txt
important.txt
Mon dossier de nettoyage contient ceci comme exemple:
ls /home/me/myfolder2tocleanup/
:
dontdeletethisfile.txt
reallyimportantfile.txt
neverdeletethis.txt
important.txt
this-can-be-deleted.txt
also-waste.txt
never-used-it.txt
Donc, ces fichiers doivent être supprimés:
this-can-be-deleted.txt
also-waste.txt
never-used-it.txt
Je recherche quelque chose pour créer une commande de suppression avec une option pour exclure certains fichiers fournis par fichier.
command-line
bash
scripts
rm
stefan83
la source
la source
Réponses:
La
rm
commande est mise en commentaire afin que vous puissiez vérifier et vérifier qu'elle fonctionne selon les besoins. Décompressez ensuite cette ligne.La
check directory
section s'assurera que vous n'exécutez pas accidentellement le script à partir du mauvais répertoire et que vous clobez les mauvais fichiers.Vous pouvez supprimer la
echo deleting
ligne pour qu'elle s'exécute en mode silencieux.la source
ls
et la capture inutile de la sortie degrep
si tout ce que vous voulez savoir est s'il y a une correspondance ou non. J'ai également utilisé des modèles de chaînes fixes pour éviter les problèmes d'échappement.while
boucle enfor
boucle, vous avez par inadvertance changé leiteration key
dei
enf
. dans la déclaration, qui a brisé le code. Je l'ai corrigé.f
. ;-P (… et +1 pour votre réponse que j'ai oubliée plus tôt.)Ce script python peut faire ceci:
La partie importante est de décommenter la
os.unlink()
fonction.REMARQUE : ajoutez ce script et
dont-delete.txt
à votredont-delete.txt
afin qu'ils figurent tous les deux dans la liste et conservez-les dans le même répertoire.la source
set
au lieu d'une liste pour O (1) au lieu de la recherche O (n) dans la deuxième partie.Voici une ligne:
ls
imprime tous les fichiers du répertoire courant (dans l'ordre trié)sort dont_delete
imprime tous les fichiers que nous ne voulons pas supprimer dans l'ordre trié<()
opérateur transforme une chaîne en un objet de type fichiercomm
commandes comparent deux fichiers pré-triés et impriment des lignes sur lesquelles ils diffèrent-2 -3
drapeaux entraînecomm
uniquement l'impression des lignes contenues dans le premier fichier mais pas le second, qui sera la liste des fichiers pouvant être supprimés en toute sécuritétail +2
appel est simplement de supprimer l'en-tête ducomm
sortie, qui contient le nom du fichier d'entréexargs
laquelle transformera le flux de sortie en une liste d'arguments pourrm
. L'-p
option obligexargs
à demander une confirmation avant l'exécution.la source
FWIW il semble que vous pouvez le faire en natif dans
zsh
, en utilisant le(+cmd)
qualificatif glob.Pour illustrer, commençons par quelques fichiers
et un fichier de liste blanche
Tout d'abord, lisez la liste blanche dans un tableau:
ou peut-être mieux
(l'équivalent de la fonction
mapfile
intégrée de bash - ou son synonymereadarray
). Maintenant, nous pouvons vérifier si une clé (nom de fichier) existe dans le tableau en utilisant${keepfiles[(I)filename]}
qui renvoie 0 si aucune correspondance n'est trouvée:Nous pouvons l'utiliser pour créer une fonction qui renvoie
true
s'il n'y a aucune correspondance pour$REPLY
dans le tableau:Enfin, nous utilisons cette fonction comme qualificatif dans notre commande:
ou, dans votre cas
(Vous souhaiterez probablement ajouter le nom du fichier de liste blanche lui-même à la liste blanche.)
la source
En supposant que votre shell bash est activé
extglob
shopt
, voici une alternative un peu plus conservatrice:(... accompagnant la suggestion de communication sinon excellente de @ gardenhead!)
la source
À moins que la sortie de
ls /home/me/myfolder2tocleanup/
dépasse la limite d'argument shell maximaleARG_MAX
qui est d'environ 2 Mo pour Ubuntu, je suggère ce qui suit.Une implémentation de commande en ligne qui fera le travail serait la suivante:
dont-delete.txt
fichier dans le répertoire contenant les fichiers à supprimer comme ceci:cd
dans le répertoire contenant les fichiers à supprimer comme ceci:la source
Je suggère fortement d'utiliser la
rsync
solution publiée ici ; sinon utiliser la solution ci-dessous avec une condition exceptionnelle mentionnée.En supposant qu'il n'y ait pas d'espaces (espaces / tabulations) dans vos fichiers 'répertoriés dans un fichier appelé
excludelist
, alors vous feriez:Ajoutez simplement
-delete
la commande ci-dessus pour supprimer les fichiers qui n'existent pas dans le fichier excludelist . Si votre découverte n'a pas l'-delete
option que vous pouvez utiliserrm
avec-exec
comme suit:Ou utiliser
-exec
avec+
terminator à la place.echo
est juste utilisé pour un essai à sec.la source
Ma suggestion est:
Mise à jour 2018-08-07
Exemple:
Notez après la ligne 3 que vous aurez le
dont-delete.txt
fichier avec le contenu:(le leader
./
est très important )Les fichiers
c
etd
seront supprimés.la source