GNU/Linux >> Tutoriales Linux >  >> Ubuntu

¿Confundido acerca de Grep y el comodín *?

Estoy ejecutando el siguiente comando para encontrar todos los archivos/directorios que no tienen nada que ver con "flash_drive_data":

find . -not -path './flash_drive_data*' | grep "./*flash*"

Hay algunas cosas que probé que me confunden:

1. Cuando ejecuto el comando anterior, obtengo algunos resultados "parciales" (es decir, no coinciden completamente con *flash* patrón. Por ejemplo:

./.local/lib/python3.7/site-packages/jedi/third_party/typeshed/third_party/2and3/flask
./.local/lib/python3.7/site-packages/jedi/third_party/typeshed/third_party/2and3/flask/cli.pyi
./.local/lib/python3.7/site-packages/jedi/third_party/typeshed/third_party/2and3/flask/signals.pyi
./.local/lib/python3.7/site-packages/jedi/third_party/typeshed/third_party/2and3/flask/templating.pyi
./.local/lib/python3.7/site-packages/jedi/third_party/typeshed/third_party/2and3/flask/sessions.pyi
./.local/lib/python3.7/site-packages/jedi/third_party/typeshed/third_party/2and3/flask/json
./.local/lib/python3.7/site-packages/jedi/third_party/typeshed/third_party/2and3/flask/json/tag.pyi

El 3/flas al final está resaltado.

2. Cuando reemplacé grep "*flash*" con solo grep "*" , Esperaba obtener todos los archivos devueltos por find, pero no obtuve ninguno. ¿Por qué? Luego, cuando hice grep "**" Creo que obtuve todos los archivos (o al menos eso creo). De nuevo, ¿por qué es eso?

3. Finalmente, el objetivo de lo que estaba haciendo anteriormente era asegurarme de que cuando ejecutara find . -not -path './flash_drive_data*' No obtenía nada relacionado con flash_drive_data. Parecía que sí (con un comportamiento inesperado con grep como expliqué anteriormente). Sin embargo, cuando ejecuté:
find . -not -path './flash_drive_data*' -exec tar cfv home.tar.bz '{}' +

Estaba obteniendo resultados que incluían cosas como:

./flash_drive_data/index2/ask-sdk-core/dist/dispatcher/error/handler/

por lo que se incluyeron archivos flash_drive_data.

Respuesta aceptada:

find . -not -path './flash_drive_data*' | grep "./*flash*"

La cosa aquí es que grep usa expresiones regulares, mientras que find -path utiliza coincidencias de patrón de estilo global de shell. El asterisco tiene un significado diferente en esos dos.

La expresión regular ./*flash* coincide primero con cualquier carácter (. ), luego cero o más barras (/* ), luego una cadena literal flas , entonces cualquier número (cero o más) de h caracteres. 3/flas coincide con eso (con cero veces h ), y también lo haría, p. reflash (con cero veces / ).

Podrías simplemente usar grep flash en cambio, dado que coincide en cualquier parte de la entrada, por lo que las partes iniciales y finales de "coincidencia con cualquier cosa" son innecesarias.

O use find -path './*flash*' -and -not -path './flash_drive_data*'

Cuando reemplacé grep "*flash*" con solo grep "*" , no obtuve [ninguna coincidencia].

Dado que el asterisco significa "cualquier número del átomo anterior", no está muy bien definido aquí. grep lo interpreta como un asterisco literal, pero en realidad debería ser un error.

Sin embargo, cuando ejecuté:find . -not -path './flash_drive_data*' -exec tar cfv home.tar.bz '{}' + Estaba obteniendo resultados que incluían cosas como:

./flash_drive_data/index2/ask-sdk-core/dist/dispatcher/error/handler/

entonces flash_drive_data se estaban incluyendo archivos.

Tenga en cuenta que tar almacena archivos recursivamente, y la primera salida de ese find es . para el directorio actual, por lo que todo se almacenará. ¡Quizás quieras usar ! -type d con find para excluir directorios de la salida, o (mejor), mire el -exclude=PATTERN opciones para tar .


Ubuntu
  1. Encuentra archivos y directorios en Linux con el comando de búsqueda

  2. Encuentre la dirección MAC en Ubuntu 21.10

  3. Encontrar archivos ejecutables usando ls y grep

  4. ¿Cuál es el significado de fork() y grep en Linux?

  5. ¿Cuál es la diferencia entre 'localizar' y 'buscar' en Linux?

Cómo encontrar una cadena o palabra específica en archivos y directorios

¿Grep para cadenas múltiples en archivos y luego listar los archivos en orden de tamaño?

¿Cómo encontrar el tipo de archivo Img y montarlo?

¿Encontrar la línea de comando?

Cómo encontrar el PID y PPID de un proceso en Linux

¿Confundido acerca de stdin, stdout y stderr?