prova qualcosa del genere :
find /home/mine -iname "*.png" -printf "%P\n " | xargs -I % -n1 cp % /home/mine/pngcoppies/copy%
Per vedere cosa succede quando esegui la ricerca, digita semplicemente set -xv
-x :stampa i comandi e i relativi argomenti mentre vengono eseguiti.
-v :Stampa le righe di input della shell mentre vengono lette.
Ecco cosa ho :
find . -name "*.xml" -exec echo {} \;
Fornisce l'output:
./log.xml
./svnLog.xml
E quando provo :
set -xv
find . -name "*.xml" -exec echo {} \;
Ottengo :
find . -name "*.xml" -exec echo {} \;
+ find . -name '*.xml' -exec echo '{}' ';'
./log.xml
./svnLog.xml
E poi find execute echo passando il nome del file trovato invece del letterale :'{}'
ma quando aggiungi qualcosa al {}
come sotto :
find . -name "*.xml" -exec echo something{} \;
+ find . -name '*.xml' -exec echo 'something{}' ';'
something{}
something{}
Qui l'eco viene eseguito due volte per i 2 file xml che ho e poiché non c'è più '{}'
è l'elenco dei parametri di exec, non verrà sostituito. quindi abbiamo ottenuto il echo 'something{}'
per ogni file trovato.
Per far fronte a ciò, puoi pensare di eseguire echo passandogli il nome del file come parametro come ad esempio :
sh -xvc 'echo sothing/$0' filename
Sappiamo già cos'è -x
e -v
. -c
è ottenere il comando dalla stringa che lo segue (man sh
)
quindi il risultato è :
sh -xvc 'echo somthing/$0' filename
+ sh -xvc 'echo somthing/$0' filename
echo somthing/$0
+ echo somthing/filename
sothing/filename
Ho usato 'echo somthing/$0
' tra '' in modo che $0 non venga espanso dalla shell corrente. provalo con " " e vedrai l'espansione di $0;)
Quindi, per tornare al tuo "problema", la ricerca dovrebbe essere formattata come segue:
find . -name "*.xml" -exec sh -xvc 'echo sothing/$0' {} \;
E otterremo :
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
Come possiamo vedere, find eseguirà la shell cammand echo sothing/$0
passandogli '{}'
(sostituito dal nome file trovato da find) quindi otteniamo il echo sothing/./log.xml
desiderato
set +xv
per rimuovere la modalità dettagliata e possiamo ottenere :
find . -name "*.xml" -exec sh -c 'echo "cp $0 someWhereElse/$0"' {} \;
cp ./log.xml someWhereElse/./log.xml
cp ./svnLog.xml someWhereElse/./svnLog.xml
quindi nel tuo caso devi solo eseguire la copia in una sub shell (aggiungi sh
o bash
o preferisci la shell dopo exec) e let find
passa il nome del file come parapetto all'it;)
find /home/mine -iname "*.png" -exec sh -c 'cp $0 /home/mine/pngcoppies/copy/$0' {} \;
Spero che questo possa essere d'aiuto e mi giustizi per il mio inglese.
Da man find:"-execdir primary è identico a -exec primary con l'eccezione che l'utilità verrà eseguita dalla directory che contiene il file corrente. Il nome file sostituito dalla stringa ``{}'' non è qualificato."
find /home/mine -iname "*.png" -execdir cp {} /home/mine/pngcoppies/copy{} \;