J'ai un long fichier texte avec la liste des masques de fichiers que je souhaite supprimer
Exemple:
/tmp/aaa.jpg
/var/www1/*
/var/www/qwerty.php
J'ai besoin de les supprimer. J'ai essayé rm `cat 1.txt` et la liste est trop longue.
J'ai trouvé cette commande, mais lorsque je vérifie les dossiers de la liste, certains d'entre eux ont encore des fichiers.
xargs rm <1.txt
L'appel manuel rm supprime les fichiers de ces dossiers, donc aucun problème avec les autorisations.
Réponses:
Ce n'est pas très efficace, mais fonctionnera si vous avez besoin de modèles glob (comme dans / var / www / *)
Si vous n'avez aucun modèle et êtes sûr que vos chemins dans le fichier ne contiennent pas d'espaces ou d'autres choses bizarres, vous pouvez utiliser des xargs comme ceci:
la source
En supposant que la liste des fichiers se trouve dans le fichier
1.txt
, procédez comme suit:L'
-r
option provoque une récursivité dans tous les répertoires nommés dans1.txt
.Si des fichiers sont en lecture seule, utilisez l'
-f
option pour forcer la suppression:Soyez prudent lorsque vous entrez dans tout outil effectuant des suppressions programmatiques. Assurez certains que les fichiers nommés dans le fichier d'entrée sont vraiment à supprimer. Faites particulièrement attention aux fautes de frappe apparemment simples. Par exemple, si vous entrez un espace entre un fichier et son suffixe, il apparaîtra comme deux noms de fichiers distincts:
est en fait deux fichiers distincts:
file
et.txt
.Cela peut ne pas sembler si dangereux, mais si la faute de frappe est quelque chose comme ça:
Ensuite , au lieu de supprimer tous les fichiers qui commencent par
myoldfiles
, vous finirez par la suppressionmyoldfiles
et tous les fichiers-non et répertoires dans le répertoire courant. Probablement pas ce que vous vouliez.la source
Utilisez ceci:
Si vous avez besoin d'une expansion globale, vous pouvez omettre de citer
$file
:Mais soyez averti que les noms de fichiers peuvent contenir du contenu "problématique" et j'utiliserais la version non citée. Imaginez ce modèle dans le fichier
Cela en supprimerait beaucoup du répertoire actuel! Je vous encourage à préparer la liste de suppression de manière à ce que les modèles globaux ne soient plus nécessaires, puis à utiliser les guillemets comme dans mon premier exemple.
la source
/My Dir With Spaces/
/Spaces and globs/*.txt
,--file-with-leading-dashes
et en prime , il est Posix et fonctionne sur GNU / Linux, BSD et macOS.Vous pouvez utiliser '\ n' pour définir le caractère de nouvelle ligne comme délimiteur.
Soyez prudent avec le -rf car il peut supprimer ce que vous ne voulez pas si le 1.txt contient des chemins avec des espaces. C'est pourquoi le nouveau délimiteur de ligne est un peu plus sûr.
Sur les systèmes BSD, vous pouvez utiliser l'option -0 pour utiliser des caractères de nouvelle ligne comme délimiteur comme ceci:
la source
xargs: illegal option -- d
-0
sur OS X.xargs -I_ rm _
fonctionne également sous OS X :) voir stackoverflow.com/a/39335402/266309-d
), vous pouvez d'abord convertir les nouvelles lignes en nuls:tr '\n' '\0' < 1.txt | xargs -0 rm
Vous pouvez utiliser ce one-liner:
Ce qui fait l'expansion du shell mais exécute
rm
le nombre minimum de fois.la source
-n <n>
argument àxargs
pour réduire le nombre d'arguments passés à chaque rm, mais cela ne vous protégera toujours pas d'un seul glob qui dépasse la limite.xargs -I{} sh -c 'rm {}' < 1.txt
devrait faire ce que vous voulez. Soyez prudent avec cette commande car une entrée incorrecte dans ce fichier peut causer beaucoup de problèmes.Cette réponse a été modifiée après que @tdavies ait souligné que l'original ne faisait pas d'expansion du shell.
la source
xargs -I{} sh -c 'rm {}' < 1.txt
Dans ce cas particulier, en raison des dangers cités dans d'autres réponses, je voudrais
Modifiez par exemple Vim et
:%s/\s/\\\0/g
, en échappant tous les caractères d'espace avec une barre oblique inverse.Ensuite
:%s/^/rm -rf /
, en ajoutant la commande. Avec,-r
vous n'avez pas à vous soucier d'avoir des répertoires répertoriés après les fichiers qu'ils contiennent, et avec-f
cela, vous ne vous plaindrez pas en raison de fichiers manquants ou d'entrées en double.Exécutez toutes les commandes:
$ source 1.txt
la source
cat 1.txt | xargs rm -f | bash
Exécutez la commande fera ce qui suit pour les fichiers uniquement.cat 1.txt | xargs rm -rf | bash
Exécutez la commande fera le comportement récursif suivant.la source
Juste pour fournir un autre moyen, vous pouvez également utiliser simplement la commande suivante
la source
Voici un autre exemple en boucle. Celui-ci contient également une 'instruction if' comme exemple de vérification pour voir si l'entrée est un 'fichier' (ou un 'répertoire' par exemple):
la source
Ici , vous pouvez utiliser ensemble de dossiers de deletelist.txt tout en évitant certains modèles aussi bien
la source
Cela permettra aux noms de fichiers d'avoir des espaces (exemple reproductible).
la source
Au cas où quelqu'un préfère
sed
et supprimer sans extension de caractères génériques :Rappel: utilisez des chemins absolus dans le fichier ou assurez-vous que vous êtes dans le bon répertoire.
Et pour être complet, la même chose avec
awk
:L'expansion des caractères génériques fonctionnera si les guillemets simples sont supprimés, mais cela est dangereux si le nom de fichier contient des espaces. Cela aurait besoin d'ajouter des guillemets autour des caractères génériques.
la source