Weiterleiten mehrerer Befehle in einer BASH-Shell

Weiterleiten mehrerer Befehle in einer BASH-Shell

Ich versuche, rekursiv durch ein Verzeichnis zu schleifen, das zahlreiche andere Verzeichnisse und Dateien enthält, und dann alle .rb-Dateien zu finden und sie in ein anderes Verzeichnis zu kopieren.

Das ist, was ich bisher habe, aber es funktioniert nicht ganz richtig, da es alles im aktuellen Verzeichnis in das angegebene Verzeichnis kopiert und nicht nur .rb-Dateien (Ruby) aus dem Verzeichnis, das rekursiv durchlaufen wird, in das Verzeichnis druckt.

Dies ist der BASH-Befehl, den ich verwende:ls -R metasploit-framework-master | grep .rb | cp * gems

In diesem Befehl metasploit-framework-masterist das Verzeichnis der obersten Ebene angegeben, das mit dem Befehl rekursiv durchlaufen wird ls -R. Dies gemsist auch das Verzeichnis, in dem alle .rb-Ruby-Dateien abgelegt werden.

Der erste Teil ls -R metasploit-framework-master | grep .rbscheint alle Quelldateien des Ruby-Skripts zu finden, aber der letzte Teil grep .rb | cp * gemsscheint die Ausgabe des Grep-Befehls nicht an den Kopierbefehl weiterzuleiten.

Kann mir bitte ein BASH-Experte weiterhelfen? `

Antwort1

Sie sollten find mit exec verwenden, siehehttp://en.wikipedia.org/wiki/Find#Execute_an_action. In Ihrem Fall sollte das Folgende funktionieren:

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

Antwort2

Am einfachsten ist es, hier etwas einzufügen xargs. xargsDamit können Sie stdinsie als Argumente in anderen Befehlen verwenden. Ich würde so etwas versuchen:

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

Dies wird jedoch nicht wirklich wie gewünscht funktionieren:

  • ls -Rwird Ihnen nicht den vollständigen Pfad geben.
  • grep .rbwird mit mehr als nur diesem Ende übereinstimmen .rbund sollte maskiert werden.
  • cp {} gemsverarbeitet keine Leerzeichen im Pfad.

Der bessere Weg hierfür ist die Verwendung find.

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

ermöglicht Ihnen die rekursive Aufzählung, die Sie möchten. Von dort aus können Sie das an weiterleiten xargsoder, noch prägnanter, das -execFlag verwenden:

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

verwandte Informationen