Piping Vários comandos em um shell BASH

Piping Vários comandos em um shell BASH

Estou tentando fazer um loop recursivo em um diretório que contém vários outros diretórios e arquivos e, em seguida, localizar todos os arquivos .rb e copiá-los para outro diretório.

Isso é o que eu tenho até agora, mas não está funcionando muito bem, pois copia tudo no diretório atual para o diretório especificado e não apenas imprime arquivos .rb (Ruby) no diretório a partir do diretório que é iterado recursivamente.

Este é o comando BASH que estou usando:ls -R metasploit-framework-master | grep .rb | cp * gems

Neste comando metasploit-framework-masterestá o diretório de nível superior para iterar recursivamente com o ls -Rcomando. Também gemsé o diretório para colocar todos os arquivos .rb ruby.

A primeira parte ls -R metasploit-framework-master | grep .rbparece encontrar todos os arquivos de origem do script Ruby, mas a última parte grep .rb | cp * gemsnão parece canalizar a saída do comando grep para o comando copy.

Algum especialista em BASH pode me ajudar? `

Responder1

Você deve usar find com exec, vejahttp://en.wikipedia.org/wiki/Find#Execute_an_action. No seu caso, isso deve bastar:

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

Responder2

A coisa mais fácil de aparecer aqui é xargs. xargspermite que você stdinos pegue e use como argumentos em outros comandos. Eu tentaria algo assim:

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

No entanto, isso realmente não funcionará como você deseja:

  • ls -Rnão vai lhe dar o caminho completo.
  • grep .rbcorresponderá a mais do que apenas aquele final .rbe deve ser escapado.
  • cp {} gemsnão tratará espaços no caminho.

A melhor maneira de fazer isso é usar find.

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

permitirá que você faça a enumeração recursiva desejada. A partir daí, você pode canalizar isso para xargsou, de forma ainda mais sucinta, usar o -execsinalizador:

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

informação relacionada