GNU/Linux >> Tutoriales Linux >  >> Linux

¿Grep Word dentro de un archivo y luego copia el archivo?

Tengo una colección de archivos (*.zip, *.txt, *.tar.gz, *.doc, etc.). Estos archivos residen dentro de una ruta. Quiero encontrar todos los archivos (*.txt), luego copiar, solo, los archivos de texto que contienen palabras específicas (por ejemplo, LINUX/UNIX).

Ejecuté lo siguiente:

find . -name "*.txt" | grep 'LINUX/UNIX'

Este comando pudo encontrar todos los archivos de texto, luego "grep" filtró los archivos de texto resultantes enumerando solo los archivos de texto que contienen 'LINUX/UNIX'.

¿Cómo puedo copiar estos archivos finales (es decir, los archivos de texto que contienen 'LINUX/UNIX') a una ruta específica de elección?

Traté de aplicar xargs

find . -name "*.txt" | grep 'LINUX/UNIX' | xargs cp <to a path>

Pero no funcionó

Respuesta aceptada:

Prueba:

grep -rl --null --include '*.txt' LINUX/UNIX . | xargs -0r cp -t /path/to/dest

Debido a que este comando utiliza la separación NUL, es seguro para todos los nombres de archivo, incluidos aquellos con nombres difíciles que incluyen espacios en blanco, tabulaciones o incluso saltos de línea.

Lo anterior requiere GNU cp . Para MacOS/FreeBSD, intente:

grep -rl --null --include '*.txt' LINUX/UNIX . | xargs -0 sh -c 'cp "[email protected]" /path/to/dest' sh

Cómo funciona:

  1. grep opciones y argumentos

    • -r le dice a grep que busque recursivamente a través de la estructura del directorio. (En FreeBSD, -r seguirá los enlaces simbólicos a los directorios. Esto no es cierto para OS/X o versiones recientes de GNU grep .)

    • --include '*.txt' le dice a grep que solo devuelva archivos cuyos nombres coincidan con el glob *.txt (incluidos los ocultos como .foo.txt o .txt ).

    • -l le dice a grep que solo devuelva los nombres de los archivos coincidentes, no la coincidencia en sí.

    • --null le dice a grep que use caracteres NUL para separar los nombres de los archivos. (--null es compatible con grep bajo GNU/Linux, MacOS y FreeBSD pero no OpenBSD.)

    • LINUX/UNIX le dice a grep que busque solo archivos cuyo contenido incluya la expresión regular LINUX/UNIX

    • . buscar en el directorio actual. Puede omitirlo en versiones recientes de GNU grep , pero luego tendría que pasar un -- terminador de opción a cp para protegerse contra los nombres de archivo que comienzan con - .

  2. xargs opciones y argumentos

    • -0 le dice a xargs que espere una entrada separada por NUL.

    • -r le dice a xargs que no ejecute el comando a menos que se encuentre al menos un archivo. (Esta opción no es necesaria ni en BSD ni en OSX y no es compatible con xargs de OSX .)

    • cp -t /path/to/dest copia los directorios en el directorio de destino. (-t requiere GNU cp .)


Linux
  1. ¿Cómo resaltar una palabra en la salida de "gato"?

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

  3. ¿Extraer archivos dentro de un archivo exe?

  4. ¿Cómo usar el comando Rsync en Linux?

  5. Encontrar la palabra más larga en un archivo de texto

Cómo copiar archivos y directorios en Linux

Comando Cp en Linux (Copiar archivos)

Las 6 mejores formas de ver archivos en Linux

Cómo copiar archivos con una extensión de archivo específica recursivamente

Cómo copiar archivos y directorios en la terminal de Linux

Copie archivos de forma segura con el comando SCP