Comment exécuter la commande sur la liste des noms de fichiers dans un fichier?

11

J'ai répertorié les noms des fichiers à supprimer dans un fichier. Comment puis-je passer le fichier à la rmcommande pour qu'il les supprime un par un.

monu
la source
1
Voir FAQ 001 sur le wiki de Greg ...
jasonwryan

Réponses:

11

Si vous avez un fichier par ligne, une façon de procéder est:

tr '\n' '\0' < list_of_files_to_be_deleted.txt | xargs -0 -r rm --

La liste des fichiers est donnée en entrée à la trcommande qui modifie le séparateur de fichiers de saut de ligne en octet nul et la xargscommande lit les fichiers séparés par des octets nuls en entrée et lance la commande rm avec les fichiers ajoutés comme arguments.

Jonas Berlin
la source
1
Je suggère également d'utiliser rm --au lieu de simplement rm, afin que les noms de fichiers qui peuvent commencer par un tiret ne soient pas traités comme des rmparamètres.
artyom
Cela n'a pas fonctionné copain ........ tr: opérande supplémentaire monu.txt' Try tr --help 'pour plus d'informations. rm: opérande manquant Essayez `rm --help 'pour plus d'informations. ........ C'est tout ce que je peux voir
lundi
1
Avez-vous peut-être manqué le <avant le nom de fichier?
Jonas Berlin
J'ai également amélioré la commande xargs - ajoutée - conformément à la suggestion de @artyom et ajouté -r pour m'assurer qu'elle ne s'exécute pas s'il n'y a aucun fichier à supprimer.
Jonas Berlin
5

La réponse ci-dessus est bonne en ce sens qu'elle va très loin pour gérer les noms de fichiers avec des espaces et des "caractères étranges". Mais la manière la plus simple, si les noms de fichiers sont sains, est juste (avertissement, bashisme!):

rm $(< /the/file/with/names)

Pour coque régulière:

rm `cat /the/file/with/names`
vonbrand
la source