Я пытаюсь рекурсивно пройтись по каталогу, содержащему множество других каталогов и файлов, а затем найти все файлы .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/ \;