GNU/Linux >> Tutoriales Linux >  >> Linux

Grep -v ¿Comportamiento inesperado?

Digamos que tengo un script simple y estúpido que elimina archivos al finalizar, luciendo así:

rm *.uvw *.xyz

El guión, o rm , para ser precisos, escribe mensajes en stderr si no puede encontrar al menos un archivo con la terminación especificada.

Ahora digamos que el script es un poco más grande y hace un poco más con un poco más de tipos de archivos y no estoy interesado en qué tipos de archivos existen y cuáles no, pero las quejas sobre tipos de archivos inexistentes obstruyen el resto de los mensajes de salida y error que me interesan más, así que quiero filtrar la salida:

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

Esto funciona bien en su mayor parte, pero elimina la parte del mensaje de los cuadros de diálogo interactivos, que por ejemplo preguntan si se debe eliminar un archivo protegido contra escritura, por lo que me preguntan sin el mensaje correspondiente.

No entiendo este comportamiento y no pude encontrar ninguna información relacionada. ¿Alguien puede explicar esto?

Respuesta aceptada:

El problema

Cuando rm solicita el uso para la entrada, no coloca una nueva línea al final de la solicitud:

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

grep está basado en líneas. Sólo puede procesar líneas completas. No puede saber si la línea debe imprimirse hasta que esté completa. Por lo tanto, las utilidades estándar para manejar el almacenamiento en búfer, como stdbuf , no puede ayudar.

La solución

Use nullglob y elimine los mensajes de archivos faltantes.

Sin nullglob, aparecen los mensajes que no desea:

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

Con él, se suprime el mensaje "No existe tal archivo o directorio":

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

Refinamiento

Si no hay ningún archivo que coincida con ninguno de los globs, aparece un mensaje de error diferente:

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

Una forma sencilla de evitar esto es asegurarse de que exista al menos uno de estos archivos:

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

Desde deleteme.xyz se borrará de todos modos, no hay problema en tocarlo antes de ejecutar rm .


Linux
  1. Grep:¿Memoria agotada?

  2. ¿Comportamiento inesperado de un script de Shell?

  3. Corte/Grep Y Df -h?

  4. Comando grep de Linux

  5. grep:captura de grupo

Grep Regex:una guía completa

14 ejemplos de comandos Grep en Linux

Cómo excluir en Grep

Expresiones regulares en Grep (Regex)

Cómo usar grep en Linux

Comando Grep en Linux/UNIX