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:
-
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 GNUgrep
.) -
--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 congrep
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 regularLINUX/UNIX
-
.
buscar en el directorio actual. Puede omitirlo en versiones recientes de GNUgrep
, pero luego tendría que pasar un--
terminador de opción acp
para protegerse contra los nombres de archivo que comienzan con-
.
-
-
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 conxargs
de OSX .) -
cp -t /path/to/dest
copia los directorios en el directorio de destino. (-t
requiere GNUcp
.)
-