versuchen Sie so etwas:
find /home/mine -iname "*.png" -printf "%P\n " | xargs -I % -n1 cp % /home/mine/pngcoppies/copy%
Um zu sehen, was passiert, wenn Sie die Suche ausführen, geben Sie einfach set -xv
ein
-x :Gibt Befehle und ihre Argumente aus, während sie ausgeführt werden.
-v :Gibt Shell-Eingabezeilen aus, während sie gelesen werden.
Hier ist, was ich habe:
find . -name "*.xml" -exec echo {} \;
Ergibt die Ausgabe:
./log.xml
./svnLog.xml
Und wenn ich versuche:
set -xv
find . -name "*.xml" -exec echo {} \;
Ich bekomme :
find . -name "*.xml" -exec echo {} \;
+ find . -name '*.xml' -exec echo '{}' ';'
./log.xml
./svnLog.xml
Und dann find execute echo, indem der gefundene Dateiname anstelle des Literals übergeben wird:'{}'
aber wenn Sie etwas zu {}
hinzufügen wie unten:
find . -name "*.xml" -exec echo something{} \;
+ find . -name '*.xml' -exec echo 'something{}' ';'
something{}
something{}
Hier wird das Echo zweimal für die 2 xml-Dateien ausgeführt, die ich habe und da es keine '{}'
mehr gibt die Parameterliste der Exec ist, wird sie nicht ersetzt. also haben wir den echo 'something{}'
für jede gefundene Datei.
Um damit fertig zu werden, können Sie daran denken, echo auszuführen, indem Sie ihm den Dateinamen als Parameter übergeben, wie zum Beispiel :
sh -xvc 'echo sothing/$0' filename
Wir wissen bereits, was -x
ist und -v
. -c
ist, den Befehl aus der Zeichenfolge danach zu erhalten (man sh
)
das Ergebnis ist also:
sh -xvc 'echo somthing/$0' filename
+ sh -xvc 'echo somthing/$0' filename
echo somthing/$0
+ echo somthing/filename
sothing/filename
Ich habe 'echo somthing/$0
verwendet ' zwischen ' ', damit $0 nicht von der aktuellen Shell erweitert wird. versuchen Sie es mit " " und Sie werden die Erweiterung von $0 sehen;)
Um auf Ihr „Problem“ zurückzukommen, sollte die Suche wie folgt formatiert sein:
find . -name "*.xml" -exec sh -xvc 'echo sothing/$0' {} \;
Und wir bekommen :
find . -name "*.xml" -exec sh -xvc 'echo sothing/$0' {} \;
+ find . -name '*.xml' -exec sh -xvc 'echo sothing/$0' '{}' ';'
echo sothing/$0
+ echo sothing/./log.xml
sothing/./log.xml
echo sothing/$0
+ echo sothing/./svnLog.xml
sothing/./svnLog.xml
Wie wir sehen können, wird die Suche den Shell-Befehl echo sothing/$0
ausführen ihm '{}'
übergeben (ersetzt durch den von find gefundenen Dateinamen), sodass wir den gewünschten echo sothing/./log.xml
erhalten
set +xv
um den ausführlichen Modus zu entfernen, erhalten wir:
find . -name "*.xml" -exec sh -c 'echo "cp $0 someWhereElse/$0"' {} \;
cp ./log.xml someWhereElse/./log.xml
cp ./svnLog.xml someWhereElse/./svnLog.xml
In Ihrem Fall müssen Sie also nur die Kopie in einer Sub-Shell ausführen (fügen Sie sh
hinzu oder bash
oder Sie bevorzugen Shell nach dem exec) und lassen Sie find
übergeben Sie den Dateinamen als Parapeter an das;)
find /home/mine -iname "*.png" -exec sh -c 'cp $0 /home/mine/pngcoppies/copy/$0' {} \;
Hoffe, das kann helfen, und entschuldige mich für mein Englisch.
Von man find:"Das primäre -execdir ist identisch mit dem primären -exec, mit der Ausnahme, dass das Dienstprogramm aus dem Verzeichnis ausgeführt wird, das die aktuelle Datei enthält. Der Dateiname, der durch die Zeichenfolge ``{}'' ersetzt wird, ist nicht qualifiziert."
find /home/mine -iname "*.png" -execdir cp {} /home/mine/pngcoppies/copy{} \;