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 NamenmyFile
-exec
:Führen Sie für die Suchergebnisse zusätzliche Befehle mit ihnen auscp /home/myuser/myFile {}
:kopiert/home/myuser/myFile
um jedes vonfind
zurückgegebene Ergebnis zu überschreiben zu; Denken Sie an{}
als wohin jedes Suchergebnis geht.';'
:Wird verwendet, um verschiedene Befehle zu trennen, die nachfind
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.