it-swarm.com.de

Ist es möglich, die Ergebnisse von FIND an einen CP mit dem Befehl COPY weiterzuleiten?

Ist es möglich, die Ergebnisse von find an einen COPY-Befehl cp weiterzuleiten?

So was:

find . -iname "*.SomeExt" | cp Destination Directory

Ich suche, ich finde immer diese Art von Formel wie aus diesem Beitrag :

find . -name "*.pdf" -type f -exec cp {} ./pdfsfolder \;

Dies wirft einige Fragen auf:

  1. Warum kannst du nicht einfach | pipe benutzen? Ist es nicht das, wofür es ist?
  2. Warum empfehlen alle den -exec
  3. Woher weiß ich, wann ich das (exec) über Pipe | verwenden soll?
14
Paul

Gute Frage!

  1. warum kannst du nicht einfach | Rohr? Ist es nicht das, wofür es ist?

Sie können natürlich xargs für folgende Fälle pfeifen:

find . -iname "*.SomeExt" | xargs cp Destination_Directory/
  1. Warum empfiehlt jeder die -exec

Der -exec ist gut, weil er mehr Kontrolle über das, was Sie ausführen, bietet. Bei jeder Pfeife können Probleme mit Eckfällen auftreten: Dateinamen mit Leerzeichen oder neuen Zeilen usw.

  1. woher weiß ich, wann ich dieses (exec) over pipe verwenden soll? ?

Es liegt wirklich an Ihnen und es kann viele Fälle geben. Ich würde -exec verwenden, wenn die auszuführende Aktion einfach ist. Ich bin kein sehr guter Freund von xargs, ich tendiere dazu, einen Ansatz zu bevorzugen, bei dem die find-Ausgabe einer while-Schleife bereitgestellt wird, wie:

while IFS= read -r result
do
    # do things with "$result"
done < <(find ...)
16
fedorqui

Es gibt eine wenig genutzte Option für cp: -t destination - siehe Manpage:

find . -iname "*.SomeExt" | xargs cp -t Directory
15
glenn jackman

Sie können | wie folgt verwenden:

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, ist viel Code erforderlich. Darüber hinaus erstellt | zwei Prozesse - einen für find und einen für cp.

  • Verwenden Sie stattdessen exec() in find, um das Problem in einem einzigen Prozess zu lösen.

6
Fazlin

Versuche dies:

find . -iname "*.SomeExt" **-print0**  | xargs **-0** cp -t Directory

Falls Leerzeichen in Dateinamen vorhanden sind.

0
epetrov