J'essaie d'écrire une commande bash qui supprimera tous les fichiers correspondant à un modèle spécifique - dans ce cas, ce sont tous les anciens fichiers journaux vmware qui se sont accumulés.
J'ai essayé cette commande:
find . -name vmware-*.log | xargs rm
Cependant, lorsque j'exécute la commande, elle s'étouffe sur tous les dossiers qui ont des espaces dans leurs noms. Existe-t-il un moyen de formater le chemin du fichier afin que xargs le passe à rm entre guillemets ou correctement échappé?
Réponses:
Je trouve généralement que l'utilisation de l'
-exec
option pourfind
être plus facile et moins confuse. Essaye ça:Tout ce qui suit
-exec
est considéré comme une commande à exécuter pour chaque résultat, jusqu'à la;
, qui est échappé ici afin qu'il soit transmis àfind
. Le{}
est remplacé par le nom de fichier quifind
s'imprime normalement.Une fois que vous avez vérifié qu'il fait ce que vous voulez, vous pouvez supprimer le
-i
.la source
Si vous avez GNU,
find
vous pouvez utiliser l'-delete
option:Pour utiliser
xargs
et éviter le problème avec les espaces dans les noms de fichiers:Cependant, vos fichiers journaux ne doivent pas avoir d'espaces dans leurs noms. Les documents de traitement de texte et les fichiers MP3 sont susceptibles de les avoir, mais vous devriez pouvoir contrôler les noms de vos fichiers journaux.
la source
Vous pouvez dire
find
de délimiter la liste de sortie avec des valeurs NULL etxargs
de recevoir la même liste d'entrée:Assurez-vous également que vous échappez à la
*
, soit avec une barre oblique inverse, soit en contenant lesvmware-*.log
guillemets simples, sinon votre shell peut essayer de la développer avant de la passerfind
.la source
N'oubliez pas l'
-delete
option de trouver . Il supprime le fichier sans erreur avec des caractères spéciaux ...la source