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-master
ist das Verzeichnis der obersten Ebene angegeben, das mit dem Befehl rekursiv durchlaufen wird ls -R
. Dies gems
ist auch das Verzeichnis, in dem alle .rb-Ruby-Dateien abgelegt werden.
Der erste Teil ls -R metasploit-framework-master | grep .rb
scheint alle Quelldateien des Ruby-Skripts zu finden, aber der letzte Teil grep .rb | cp * gems
scheint 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
. xargs
Damit können Sie stdin
sie 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 -R
wird Ihnen nicht den vollständigen Pfad geben.grep .rb
wird mit mehr als nur diesem Ende übereinstimmen.rb
und sollte maskiert werden.cp {} gems
verarbeitet 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 xargs
oder, noch prägnanter, das -exec
Flag verwenden:
$ find metasploit-framework-master -name '*.rb' -exec cp {} gems/ \;