Es gibt eine wenig genutzte Option für cp
:-t destination
-- siehe Manpage:
find . -iname "*.SomeExt" | xargs cp -t Directory
Sie können |
verwenden wie unten:
find . -iname "*.SomeExt" | while read line
do
cp $line DestDir/
done
Beantwortung Ihrer Fragen:
-
|
kann verwendet werden, um dieses Problem zu lösen. Aber wie oben gesehen, beinhaltet es eine Menge Code. Außerdem|
erstellt zwei Prozesse - einen fürfind
und eine weitere fürcp
. -
Verwenden Sie stattdessen
exec()
innerhalb vonfind
löst das Problem in einem einzigen Vorgang.
Gute Frage!
- warum kannst du nicht einfach | verwenden Rohr? ist das nicht wofür?
Sie können natürlich xargs
pipen wird für diese Fälle durchgeführt:
find . -iname "*.SomeExt" | xargs cp Destination_Directory/
- Warum empfiehlt jeder die -exec
Die -exec
ist gut, weil es mehr Kontrolle darüber bietet, was Sie genau ausführen. Beim Pipen kann es zu Problemen mit Groß- und Kleinschreibung kommen:Dateinamen mit Leerzeichen oder Zeilenumbrüchen etc.
- Woher weiß ich, wann ich das (exec) über Pipe | verwenden soll ?
Es liegt wirklich an Ihnen und es kann viele Fälle geben. Ich würde -exec
verwenden wann immer die auszuführende Aktion einfach ist. Ich bin kein sehr guter Freund von xargs
, bevorzuge ich eher einen Ansatz, bei dem find
Die Ausgabe erfolgt an while
Schleife, wie zum Beispiel:
while IFS= read -r result
do
# do things with "$result"
done < <(find ...)