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-master
se encuentra el directorio de nivel superior para iterar recursivamente con el ls -R
comando. También gems
es el directorio donde colocar todos los archivos .rb Ruby.
La primera parte ls -R metasploit-framework-master | grep .rb
parece encontrar todos los archivos fuente del script Ruby, pero la última parte grep .rb | cp * gems
no 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
. xargs
le permite tomarlos stdin
y 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 -R
no te dará el camino completo.grep .rb
coincidirá con algo más que ese final.rb
y se debe escapar.cp {} gems
no 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 -exec
bandera:
$ find metasploit-framework-master -name '*.rb' -exec cp {} gems/ \;