Résultats du tuyau de localisation dans rm

11

J'ai essayé de courir

locate *.orig | xargs rm

mais ça disait No such file or directory

J'ai vu des façons de le faire, findmais Locate renvoie le chemin complet de l'objet, donc cela devrait être possible

soldat.moth
la source

Réponses:

20

Si les noms de fichiers contiennent des espaces, vous devez les utiliser

locate -0 $something | xargs -0 rm

Depuis la locatepage de manuel :

-0, --nullSéparez les entrées en sortie à l'aide du caractère ASCII NUL au lieu d'écrire chaque entrée sur une ligne distincte. Cette option est conçue pour l'interopérabilité avec l'option --null de GNU xargs (1).

ou

locate $something | while read f; do rm "$f"; done

En outre, vous devez protéger *.origavec des guillemets, pour éviter l'expansion du shell, et le transmettre pour le localiser intact.

enzotib
la source
Qu'entendez-vous par «expansion du shell»?
soldier.moth
+1 pour votre deuxième exemple. J'utilise toujours | while readcar mon répertoire personnel est plein de fichiers avec des espaces.
matpie
@ Soldier.moth: si dans le dossier actuel il y a des fichiers correspondant au motif *.orig, le shell étendra le motif à, disons file1.orig file2.orig ..., de sorte que locatela chaîne exacte ne sera pas vue *.origcomme il se doit.
enzotib
Aussi pour localiser la sortie grep, vous pouvez ensuite tr '\n' '\0'.
Pablo Bianchi
2

Ce n'est xargspasxarg

maco
la source
C'est ce que je voulais dire en tapant une question de mémoire, merci.
soldier.moth
Ah d'accord. Il ressemblait à l'erreur que vous obtiendriez en mettant une commande incorrecte après |
maco du
0

La commande locate *.orig | xargs rmfonctionne réellement, mais ce qui se passait, c'est que la locaterecherche de *.origfichiers dans la poubelle et rmcrache l'erreur No such file or directorylors de la tentative de suppression de fichiers dans la poubelle.

soldat.moth
la source
Vous devez ajouter des informations en tant que «commentaire» à la réponse d'origine, ou vous pouvez modifier la réponse d'origine. Ce n'est pas une réponse à votre propre question.
enzotib
C'est une réponse à ma question, la raison pour laquelle j'obtenais l'erreur était parce que Locate trouvait des fichiers * .orig dans la corbeille et rm n'a pas pu les supprimer. J'ai accepté votre réponse et j'ai voté pour les deux autres réponses car elles étaient bien écrites et pourraient aider quelqu'un qui viendra plus tard.
soldier.moth
0

Locate ne fait pas le globbing, mais le shell le fait. Le shell étend * .orig à ce qu'il trouve dans le répertoire courant qui correspond à * .orig.

Utilisez simplement

locate .orig

et si cela vous donne ce dont vous avez besoin

locate .orig | xargs rm

ou, comme l'enzotib l'a mentionné

locate -0 .orig | xargs -0 rm

si vous avez des espaces dans les noms de fichiers.

Utilisateur inconnu
la source
0

Une astuce: enregistrez tous les chemins dans le fichier tmp. puis, bouclez dessus:

#!/bin/bash
locate .orig /tmp/tmp.txt
while read line
do
    pth=$line
    rm "$pth" 
done < /tmp/tmp.txt

rm -rf /tmp/tmp.txt 
Abdennour TOUMI
la source