Es gibt ein paar Möglichkeiten, ausgeführt werden sollte.
Wenn keiner der Dateinamen Leerzeichen oder Sonderzeichen hat (sie bestehen nur aus Buchstaben, Zahlen, Bindestrichen und Unterstrichen), dann ist das Folgende eine einfache Lösung, die funktioniert. Sie können $(command)
verwenden, um einen Befehl auszuführen, und die Ergebnisse in die Argumente eines anderen Befehls einfügen. Die Shell teilt das Ergebnis in Leerzeichen, Tabulatoren oder Zeilenumbrüche auf, und for
weist der Reihe nach jeden Wert $f
zu und führt den Befehl für jeden Wert aus.
for f in $(find . -name myFile)
do
cp something $f
done
Wenn Sie Leerzeichen oder Tabs tun, könnten Sie -exec
Option der Fund verwenden. Sie übergeben -exec command args
, setzen {}
, wo der Dateiname ersetzt werden soll, und beenden Sie die Argumente mit einer ;
. Sie müssen die {}
und ;
angeben, damit die Shell sie nicht interpretiert.
find . -name myFile -exec cp something "{}" \;
Manchmal reicht -exec
nicht aus. Zum Beispiel wollten sie in this question die Bash-Parametererweiterung verwenden, um den Dateinamen zu berechnen. Um dies zu tun, müssen Sie -exec bash -c 'your command'
übergeben, aber dann werden Sie mit der {}
Ersetzung Probleme auftreten. Um dies zu lösen, können Sie -print0
von find
verwenden, um die Ergebnisse zu drucken, mit Null-Zeichen begrenzt (die in Dateinamen ungültig sind), und eine Pipe an eine while read
Schleife, die Parameter auf NULL-Wert teilt:
find . -name myFile -print0 | (while read -d $'\0' f; do
cp something "$f"
done)
Ändern Sie einfach die Reihenfolge von {} in die zweite Position nach/home/myuser/myFile, und es funktioniert. Vielen Dank. –
@ LuisAndrésGarcía, ah, ich könnte dich missverstanden haben - du wolltest die eine Datei '/ home/myuser/myFile' kopieren, um' myFile' zu ersetzen, die durch 'find' in der cwd gefunden wurden? –
Sie haben Recht! :) Ein weiteres Beispiel, um die Eigenschaften einer gefundenen Datei aufzulisten, ist: find -exec ls -l {} ';' –