Передача нескольких команд в оболочке BASH

Передача нескольких команд в оболочке BASH

Я пытаюсь рекурсивно пройтись по каталогу, содержащему множество других каталогов и файлов, а затем найти все файлы .rb и скопировать их в другой каталог.

Это то, что у меня есть на данный момент, но это работает не совсем правильно, так как копирует все данные из текущего каталога в указанный каталог, а не только выводит файлы .rb (ruby) в каталог из каталога, который рекурсивно просматривается.

Вот команда BASH, которую я использую:ls -R metasploit-framework-master | grep .rb | cp * gems

В этой команде metasploit-framework-masterесть каталог верхнего уровня для рекурсивного обхода с помощью ls -Rкоманды. Также gemsесть каталог для размещения всех .rb ruby ​​файлов.

Первая часть, ls -R metasploit-framework-master | grep .rbпохоже, находит все исходные файлы скрипта Ruby, но последняя часть, grep .rb | cp * gemsпохоже, не передает вывод команды grep в команду copy.

Может ли мне помочь эксперт по BASH?

решение1

Вам следует использовать find с exec, см.http://en.wikipedia.org/wiki/Find#Execute_an_actionВ вашем случае это должно сработать:

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

решение2

Самое простое, что можно сюда вставить, это xargs. xargsпозволяет брать stdinи использовать их как аргументы в других командах. Я бы попробовал что-то вроде этого:

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

Однако на самом деле это не будет работать так, как вам хотелось бы:

  • ls -Rне даст вам полного пути.
  • grep .rbбудет соответствовать большему количеству символов, чем тот, который заканчивается на .rbи должен быть экранирован.
  • cp {} gemsне будет обрабатывать пробелы в пути.

Лучший способ сделать это — использовать find.

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

позволит вам сделать рекурсивное перечисление, которое вы хотите. Оттуда вы можете передать это в xargs, или даже более кратко использовать -execфлаг:

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

Связанный контент