¿Cómo puedo determinar si diferentes comandos que usan grep, find y xargs hacen lo mismo?

¿Cómo puedo determinar si diferentes comandos que usan grep, find y xargs hacen lo mismo?

¿Estos tres comandos hacen lo mismo?

  • Un comando que usa grep.

    grep "a" -r .
    
  • Un comando que utiliza buscar.

    find .  -exec grep "a" {} \;
    
  • Un comando que utiliza grep en una búsqueda a través de xargs.

    find . | xargs grep "a"
    

Respuesta1

No son iguales y cada uno tiene problemas.

  • El primero no es portátil ya que utiliza una extensión Gnu. Además, se espera que las opciones estén antes del patrón, no después de él.
  • El segundo no muestra el nombre del archivo, como ya se indicó.
  • El tercero fallará si los nombres de los archivos tienen espacios incrustados o similares.

Yo usaría en su lugar:

find .  -type f -exec grep a /dev/null {} +

Es portátil, ignora los archivos no normales, no choca con nombres de archivos extraños y siempre mostrará los nombres de los archivos cuando se encuentre el patrón.

Respuesta2

¿Es esta una pregunta de tarea?

¿Los probaste?

Hacen cosas ligeramente diferentes.

Por ejemplo, si alimenta grepun solo nombre de archivo, no se repite el nombre del archivo en la salida. Esto puede resultar frustrante cuando se utiliza grepcon find.

Respuesta3

Deberías definir mejor "hacer lo mismo". El primero ejecuta un comando, el segundo ejecuta un grep find y fork+exec una vez por archivo encontrado, y el tercero ejecuta un mínimo de tres comandos, o más si se encuentran demasiados archivos que caben en una línea de comando. En lo que respecta al impacto en la CPU/memoria, lo hacen más claramentenohaga lo mismo: la diferencia entre 1, tres y "un montón" de procesos es significativa.

Desde la perspectiva del sistema de archivos, se recorre el sistema de archivos, cada archivo se actualiza y luego se abre, se lee por completo y se cierra. Entonces, todos hacen lo mismo desde esa perspectiva, y el sistema de archivos no nota ninguna diferencia (aparte de quizás un recorrido más lento en la segunda instancia debido a la sobrecarga de bifurcar millones de procesos).

La salida generada en la pantalla difiere, y esa diferencia se puede determinar empíricamente simplemente ejecutando los comandos con algunas estructuras de directorio posibles diferentes (una forma obvia es la que mencionó redgrittybrick).

Consumen diferentes cantidades de tiempo para escribir, debido a la cantidad de caracteres diferentes y a las posibilidades de errores de sintaxis.

Etcétera. Hay muchas formas en que las cosas pueden "diferir". :)

información relacionada