GNU/Linux >> Tutoriels Linux >  >> Linux

Grep -v Comportement inattendu ?

Disons que j'ai un simple script stupide qui supprime les fichiers en se terminant, ressemblant à ceci :

rm *.uvw *.xyz

Le script, ou rm , pour être précis, écrit des messages sur stderr s'il ne trouve pas au moins un fichier avec la fin spécifiée.

Maintenant, disons que le script est un peu plus gros et fait un peu plus avec un peu plus de types de fichiers et je ne suis pas intéressé par les types de fichiers existants et ceux qui ne le sont pas, mais les plaintes concernant les types de fichiers inexistants obstruent le reste de les messages de sortie et d'erreur qui m'intéressent le plus, je souhaite donc filtrer la sortie :

rm *.uvw *.xyz 2>&1 | grep -v "No such file or directory"

Cela fonctionne bien pour la plupart, mais cela supprime la partie message des boîtes de dialogue interactives, qui demandent par exemple si un fichier protégé en écriture doit être supprimé, donc je reçois une invite sans le message correspondant.

Je ne comprends pas ce comportement et je n'ai trouvé aucune information connexe. Quelqu'un peut-il expliquer cela ?

Réponse acceptée :

Le problème

Lorsque rm invite à utiliser pour l'entrée, il ne met pas de nouvelle ligne à la fin de l'invite :

$ rm *.uvw *.xyz
rm: remove write-protected regular empty file 'a.xyz'?

grep est basé sur la ligne. Il ne peut traiter que des lignes complètes. Il ne peut pas dire si la ligne doit être imprimée tant que la ligne n'est pas complète. Ainsi, les utilitaires standard pour gérer la mise en mémoire tampon, tels que stdbuf , ne peut pas aider.

La solution

Utilisez nullglob et supprimez les messages de fichiers manquants.

Sans nullglob, les messages que vous ne souhaitez pas afficher :

$ rm *.uvw *.xyz
rm: cannot remove '*.uvw': No such file or directory
rm: remove write-protected regular empty file 'a.xyz'? n

Avec lui, le message "Aucun fichier ou répertoire de ce type" n'est supprimé :

$ shopt -s nullglob
$ rm *.uvw *.xyz
rm: remove write-protected regular empty file 'a.xyz'? n

Raffinement

S'il n'y a aucun fichier correspondant à l'un ou l'autre des globs, un message d'erreur différent apparaît :

$ shopt -s nullglob
$ rm *.uvw *.xyz
rm: missing operand
Try 'rm --help' for more information.

Un moyen simple d'éviter cela est de s'assurer qu'au moins un tel fichier existe :

shopt -s nullglob
[ -e "deleteme.xyz" ] ||touch deleteme.xyz
rm *.uvw *.xyz

Depuis deleteme.xyz va être effacé de toute façon, il n'y a pas de mal à le toucher avant d'exécuter rm .


Linux
  1. Grep :Mémoire épuisée ?

  2. Comportement inattendu d'un script shell ?

  3. Couper / Grep Et Df -h ?

  4. Grep et queue -f ?

  5. Commande grep Linux

Grep Regex :un guide complet

14 exemples de commandes Grep sous Linux

Comment exclure dans Grep

Expressions régulières dans Grep (Regex)

Comment utiliser grep sous Linux

Commande Grep sous Linux/UNIX