zkuste něco takového :
find /home/mine -iname "*.png" -printf "%P\n " | xargs -I % -n1 cp % /home/mine/pngcoppies/copy%
Chcete-li vidět, co se děje při spuštění hledání, stačí napsat set -xv
-x :Tiskne příkazy a jejich argumenty při jejich provádění.
-v :Tiskne vstupní řádky shellu při jejich čtení.
Tady je to, co mám:
find . -name "*.xml" -exec echo {} \;
Dává výstup:
./log.xml
./svnLog.xml
A když to zkusím :
set -xv
find . -name "*.xml" -exec echo {} \;
Chápu :
find . -name "*.xml" -exec echo {} \;
+ find . -name '*.xml' -exec echo '{}' ';'
./log.xml
./svnLog.xml
A pak najděte provést echo, které předá nalezený název souboru místo písmena:'{}'
ale když přidáte něco do {}
jako níže:
find . -name "*.xml" -exec echo something{} \;
+ find . -name '*.xml' -exec echo 'something{}' ';'
something{}
something{}
Zde se echo provede dvakrát pro 2 xml soubory, které mám, a protože již není '{}'
je seznam parametrů exec, nebude nahrazen. takže máme echo 'something{}'
pro každý nalezený soubor.
Chcete-li se s tím vypořádat, můžete přemýšlet o provedení echo, které mu předá název souboru jako parametr, jako například:
sh -xvc 'echo sothing/$0' filename
Již víme, co je -x
a -v
. -c
je získat příkaz z řetězce za ním (man sh
)
takže výsledek je:
sh -xvc 'echo somthing/$0' filename
+ sh -xvc 'echo somthing/$0' filename
echo somthing/$0
+ echo somthing/filename
sothing/filename
Použil jsem 'echo somthing/$0
' mezi ' ', aby se $0 nerozbalilo aktuálním shellem. zkuste to s " " a uvidíte rozšíření o $0;)
Abychom se vrátili k vašemu „problému“, měl by být nález ve formátu níže:
find . -name "*.xml" -exec sh -xvc 'echo sothing/$0' {} \;
A dostaneme :
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
Jak vidíme, nález spustí příkaz shellu echo sothing/$0
předá mu '{}'
(nahrazeno názvem souboru nalezeným funkcí find), takže dostaneme požadovaný echo sothing/./log.xml
set +xv
pro odstranění podrobného režimu a můžeme získat:
find . -name "*.xml" -exec sh -c 'echo "cp $0 someWhereElse/$0"' {} \;
cp ./log.xml someWhereElse/./log.xml
cp ./svnLog.xml someWhereElse/./svnLog.xml
takže ve vašem případě stačí provést kopii v sub shellu (přidejte sh
nebo bash
nebo preferujete shell po exec) a nechte find
předat název souboru jako parapet do it;)
find /home/mine -iname "*.png" -exec sh -c 'cp $0 /home/mine/pngcoppies/copy/$0' {} \;
Doufám, že vám to pomůže a omluvte mě za mou angličtinu.
Z man find:"Primární -execdir je identický s primárním -exec s tou výjimkou, že obslužný program bude spuštěn z adresáře, který obsahuje aktuální soubor. Název souboru nahrazený řetězcem ``{}'' není kvalifikovaný."
find /home/mine -iname "*.png" -execdir cp {} /home/mine/pngcoppies/copy{} \;