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 * gemsgrep 명령의 출력을 복사 명령으로 파이프하지 않는 것 같습니다.

BASH 전문가가 저를 도와주실 수 있나요? `

답변1

exec와 함께 find를 사용해야 합니다.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/ \;

관련 정보