Я пытаюсь рекурсивно перебрать каталог, который содержит множество других каталогов и файлов, а затем найти все файлы .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 Похоже, что cp * gems не передается при выводе команды grep команде copy.

Могут ли какие-нибудь эксперты BASH помочь мне? `

2 ответа2

2

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

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

Легче всего сюда заглянуть - это 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/ \;

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .