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-master
está o diretório de nível superior para iterar recursivamente com o ls -R
comando. Também gems
é o diretório para colocar todos os arquivos .rb ruby.
A primeira parte ls -R metasploit-framework-master | grep .rb
parece encontrar todos os arquivos de origem do script Ruby, mas a última parte grep .rb | cp * gems
nã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
. xargs
permite que você stdin
os 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 -R
não vai lhe dar o caminho completo.grep .rb
corresponderá a mais do que apenas aquele final.rb
e deve ser escapado.cp {} gems
nã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 xargs
ou, de forma ainda mais sucinta, usar o -exec
sinalizador:
$ find metasploit-framework-master -name '*.rb' -exec cp {} gems/ \;