GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Linux-Befehlsausgabe als Parameter eines anderen Befehls

Das wollen Sie:

find . -name myFile -exec cp /home/myuser/myFile {} ';'

Eine Aufschlüsselung/Erklärung dazu:

  • find :Aufrufen des Find-Befehls
  • . :Suche vom aktuellen Arbeitsverzeichnis starten.
  • Da keine Tiefen-Flags angegeben sind, wird rekursiv nach allen Unterordnern gesucht
  • -name myFile :findet Dateien mit dem expliziten Namen myFile
  • -exec :Führen Sie für die Suchergebnisse zusätzliche Befehle mit ihnen aus
  • cp /home/myuser/myFile {} :kopiert /home/myuser/myFile um jedes von find zurückgegebene Ergebnis zu überschreiben zu; Denken Sie an {} als wohin jedes Suchergebnis geht.
  • ';' :Wird verwendet, um verschiedene Befehle zu trennen, die nach find ausgeführt werden sollen

Es gibt mehrere Möglichkeiten, dies zu lösen, je nachdem, ob Sie sich Gedanken über Dateien mit Leerzeichen oder anderen Sonderzeichen im Namen machen müssen.

Wenn keiner der Dateinamen Leerzeichen oder Sonderzeichen enthält (sie bestehen nur aus Buchstaben, Zahlen, Bindestrichen und Unterstrichen), dann ist die folgende einfache Lösung, die funktioniert. Sie können $(command) verwenden um einen Befehl auszuführen und die Ergebnisse in die Argumente eines anderen Befehls einzusetzen. Die Shell teilt das Ergebnis in Leerzeichen, Tabulatoren oder Zeilenumbrüche und for auf weisen Sie jedem Wert $f zu wiederum und führen Sie den Befehl für jeden Wert aus.

for f in $(find . -name myFile)
do
    cp something $f
done

Wenn Sie Leerzeichen oder Tabulatoren haben, können Sie -exec von find verwenden Möglichkeit. Sie passieren -exec command args , indem Sie {} einfügen wo der Dateiname ersetzt werden soll, und beenden Sie die Argumente mit einem ; . Sie müssen den {} zitieren und ; damit die Shell sie nicht interpretiert.

find . -name myFile -exec cp something "{}" \;

Manchmal -exec ist nicht ausreichend. In dieser Frage wollten sie beispielsweise die Bash-Parametererweiterung verwenden, um den Dateinamen zu berechnen. Dazu müssen Sie -exec bash -c 'your command' passieren , aber dann werden Sie mit dem {} auf Zitierprobleme stoßen Auswechslung. Um dies zu lösen, können Sie -print0 verwenden ab find um die Ergebnisse mit Nullzeichen (die in Dateinamen ungültig sind) getrennt auszugeben und an while read zu leiten Schleife, die Parameter auf Nullen aufteilt:

find . -name myFile -print0 | (while read -d $'\0' f; do
    cp something "$f"
  done)

Die Pipe sendet die Ausgabe eines Programms an die Eingabe eines anderen. cp liest nicht aus seinem Eingabestrom am Terminal, sondern verwendet lediglich die Argumente auf der Befehlszeile.

Sie möchten entweder xargs verwenden mit der Pipe oder find ist exec Argument statt Pipes.

find . -name myFile 2>&1 | xargs -I {} cp /home/myuser/myFile {}

Hinweis:Option -I {} definiert {} Als Platzhalter können Sie alternativ auch einen anderen Platzhalter verwenden, falls dieser mit dem auszuführenden Befehl kollidiert.


Linux
  1. So weisen Sie einer Variablen die Ausgabe eines Linux-Befehls zu

  2. So speichern Sie die Befehlsausgabe in einer Datei unter Linux

  3. Beispiele für Linux-Zeitbefehle

  4. tee-Befehlsbeispiele in Linux

  5. Linux-Suchbefehl - Fortschritt anzeigen

Linux-Fingerbefehl zum Suchen von Benutzerdetails

iftop-Befehl unter Linux

lsblk-Befehl unter Linux

So finden Sie die IP-Adresse in der Linux-Befehlszeile

Finden Sie Befehl in Linux/UNIX

Beispiele für Linux-Echo-Befehle