Canalización de varios comandos en un shell BASH

Canalización de varios comandos en un shell BASH

Estoy intentando recorrer de forma recursiva un directorio que contiene muchos otros directorios y archivos y luego encontrar todos los archivos .rb y copiarlos a otro directorio.

Esto es lo que tengo hasta ahora, pero no funciona del todo bien, ya que copia todo el contenido del directorio actual en el directorio especificado y no solo imprime archivos .rb (ruby) en el directorio desde el directorio que se repite de forma recursiva.

Este es el comando BASH que estoy usando:ls -R metasploit-framework-master | grep .rb | cp * gems

En este comando metasploit-framework-masterse encuentra el directorio de nivel superior para iterar recursivamente con el ls -Rcomando. También gemses el directorio donde colocar todos los archivos .rb Ruby.

La primera parte ls -R metasploit-framework-master | grep .rbparece encontrar todos los archivos fuente del script Ruby, pero la última parte grep .rb | cp * gemsno parece canalizar la salida del comando grep al comando de copia.

¿Puede algún experto en BASH ayudarme? `

Respuesta1

Deberías usar find con exec, verhttp://en.wikipedia.org/wiki/Find#Execute_an_action. En tu caso, esto debería bastar:

find metasploit-framework-master -name '*.rb' -exec cp -av {} gems \;

Respuesta2

Lo más fácil de pasar aquí es xargs. xargsle permite tomarlos stdiny usarlos como argumentos en otros comandos. Yo intentaría algo como esto:

## This will not work as expected ## 
$ ls -R metasploit-framework-master | grep .rb | xargs -I{} cp {} gems

Sin embargo, esto realmente no funcionará como desea:

  • ls -Rno te dará el camino completo.
  • grep .rbcoincidirá con algo más que ese final .rby se debe escapar.
  • cp {} gemsno manejará espacios en el camino.

La mejor manera de hacer esto es usar find.

$ find metasploit-framework-master -name '*.rb' | xargs -I{} cp {} gems/

le permitirá hacer la enumeración recursiva que desee. Desde allí puedes canalizar eso a xargs, o aún más conciso usar la -execbandera:

$ find metasploit-framework-master -name '*.rb' -exec cp {} gems/ \;

información relacionada