Supprimer tous les fichiers correspondant au nom de la liste

2

J'ai un dossier avec beaucoup d'images.

Mon client m'a envoyé une liste des images rejetées que je dois supprimer de ce dossier.

La liste est comme ceci: _001,_002,_003,_004,_006,_007,RAM08953,RAM08995,RAM08996,RAM09039,RAM09060,RAM09087,RAM09101,RAM09104,RAM09115,RAM09126,RAM09170,RAM09171,RAM09172,RAM09176,RAM09188.

Comment puis-je facilement exécuter quelque chose qui supprime ces fichiers, ou déplace ces fichiers dans un nouveau dossier ou quelque chose sans le faire à la main? Il peut s'agir d'une application, d'un script shell ou de toute autre astuce.

Rui Ganga
la source

Réponses:

0

Vous pouvez supprimer une liste de noms de fichiers séparés par des virgules à l'aide d'un fichier CSV à l'aide de la commande suivante:

for file in $( cat foo.csv | awk '{gsub(",","\n"); print $0}' ); do rm $file; done

Vous pouvez le rendre plus sûr en déplaçant le fichier dans la corbeille au lieu de le supprimer:

for file in $( cat foo.csv | awk '{gsub(",","\n"); print $0}' ); do mv $file ~/.Trash; done

Comment ça marche

Ceci est une boucle FOR / DO qui prend d’abord le contenu de foo.csv et

  • cat foo.csv | Ceci sort le contenu entier du fichier CSV et le dirige vers la commande suivante
  • awk '{gsub(",","\n"); print $0} Cette ligne prend la sortie de la commande précédente et utilise le awk l’utilitaire de traitement de texte remplace alors la virgule ( , ) pour le caractère de nouvelle ligne ( \n ). Il affiche ensuite chaque élément ( print $0 ) sur une ligne séparée
  • chaque ligne devient un "élément" pour la boucle FOR à itérer.
  • pour chaque élément, il donnera la commande rm $file
  • Vous pouvez supprimer / déplacer / renommer / n’importe quel fichier en modifiant la commande après do. (Par exemple. do mv $file ~/Foo/Bar/$file pour le déplacer dans un autre dossier.)
Allan
la source
Utilisation inutile de cat et | comme awk va lire le fichier en tant que argument , c'est-à-dire, "$(awk '{gsub(/,/, "\n")}1' foo.csv)", est tout ce qui est nécessaire.
user3439894
@ user3439894 - Ok ... c'est plus court et plus efficace, mais j'aime ma méthode car je n'utilise pas awk mais une fois dans une lune bleue et ça coule avec mon style de codage. Il n'y a rien d'inutile à cela.
Allan
Tu as dit " Il n'y a rien d'inutile à cela. ", eh bien, l'utilisation d'une commande et d'un tuyau externes inutiles, quand ce n'est pas du tout nécessaire, est en effet inutile! Je ne veux certainement rien dire de désobligeant par ce que j'ai dit et bien que vous ne puissiez pas utiliser awk que souvent et pendant que mon awk commander est plus compact, néanmoins, ce n’était pas l’argument principal. Je ne fais que souligner ce qui est généralement considéré comme un très mauvais paradigme de programmation. FWIW Moi aussi, j’ai l'habitude de coder de la même manière, mais j'ai appris à le faire mieux à la suite de commentaires comme ceux-là.
user3439894
Point pris. Permettez-moi d'en partager un avec vous ... Commencer votre "critique" par le mot "inutile" est péjoratif.
Allan
1

Pour supprimer une liste de noms de fichiers séparés par des virgules d'un dossier, vous pouvez utiliser les éléments suivants:

tr , '\n' <<< "file.jpg,second.jpg,…" | xargs -I{} rm /path/to/folder/{}

Remplacer file.jpg,second.jpg,… avec votre liste de fichiers séparés par des virgules.
Remplacer /path/to/folder avec le chemin d'accès au dossier contenant les images.

tr , '\n' remplace les virgules dans l'entrée par de nouvelles lignes. xargs prend les lignes et exécute la commande donnée pour chaque ligne, en remplacement de {} avec chaque entrée de ligne (comme indiqué par -I{} ). tr est utilisé depuis xargs dans macOS ne supporte pas -d pour un délimiteur personnalisé.

Cependant, je remarque que votre liste n'inclut pas les extensions de fichier. Vous pouvez plutôt ajouter l'extension à la fin de la commande.

tr , '\n' <<< "file,second,…" | xargs -I{} rm /path/to/folder/{}.jpg
grg
la source