coba sesuatu seperti ini :
find /home/mine -iname "*.png" -printf "%P\n " | xargs -I % -n1 cp % /home/mine/pngcoppies/copy%
Untuk melihat apa yang terjadi saat Anda menjalankan pencarian, cukup ketik set -xv
-x :Mencetak perintah dan argumennya saat dijalankan.
-v :Mencetak baris input shell saat dibaca.
Inilah yang saya miliki :
find . -name "*.xml" -exec echo {} \;
Memberikan output:
./log.xml
./svnLog.xml
Dan ketika saya mencoba :
set -xv
find . -name "*.xml" -exec echo {} \;
Saya mendapatkan :
find . -name "*.xml" -exec echo {} \;
+ find . -name '*.xml' -exec echo '{}' ';'
./log.xml
./svnLog.xml
Dan kemudian temukan jalankan gema dengan meneruskan nama file yang ditemukan alih-alih literal :'{}'
tetapi ketika Anda menambahkan sesuatu ke {}
seperti di bawah ini :
find . -name "*.xml" -exec echo something{} \;
+ find . -name '*.xml' -exec echo 'something{}' ';'
something{}
something{}
Di sini gema dijalankan dua kali untuk 2 file xml yang saya miliki dan karena tidak ada lagi '{}'
adalah daftar parameter exec, itu tidak akan diganti. jadi kami mendapatkan echo 'something{}'
untuk setiap file yang ditemukan.
Untuk mengatasinya, Anda dapat berpikir untuk mengeksekusi gema yang meneruskan nama file sebagai parameter seperti misalnya :
sh -xvc 'echo sothing/$0' filename
Kita sudah tahu apa itu -x
dan -v
. -c
adalah untuk mendapatkan perintah dari string setelahnya (man sh
)
jadi hasilnya adalah :
sh -xvc 'echo somthing/$0' filename
+ sh -xvc 'echo somthing/$0' filename
echo somthing/$0
+ echo somthing/filename
sothing/filename
Saya menggunakan 'echo somthing/$0
' antara ' ' sehingga $0 tidak diperluas oleh Shell saat ini. coba dengan " " dan Anda akan melihat perluasan $0;)
Jadi untuk kembali ke 'masalah' Anda, pencarian harus diformat seperti di bawah ini:
find . -name "*.xml" -exec sh -xvc 'echo sothing/$0' {} \;
Dan kita akan mendapatkan :
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
Seperti yang bisa kita lihat, find akan mengeksekusi shell cammand echo sothing/$0
meneruskannya ke '{}'
(diganti dengan nama file yang ditemukan oleh find) sehingga kita mendapatkan echo sothing/./log.xml
yang diinginkan
set +xv
untuk menghapus mode verbose dan kita bisa mendapatkan :
find . -name "*.xml" -exec sh -c 'echo "cp $0 someWhereElse/$0"' {} \;
cp ./log.xml someWhereElse/./log.xml
cp ./svnLog.xml someWhereElse/./svnLog.xml
jadi dalam kasus Anda, Anda hanya perlu menjalankan salinan di sub Shell (tambahkan sh
atau bash
atau shell favorit Anda setelah exec) dan biarkan find
berikan nama file sebagai pembatas ke it;)
find /home/mine -iname "*.png" -exec sh -c 'cp $0 /home/mine/pngcoppies/copy/$0' {} \;
Semoga ini bisa membantu, dan maafkan saya untuk bahasa Inggris saya.
Dari man find:"The -execdir primary identik dengan -exec primary dengan pengecualian bahwa utilitas akan dieksekusi dari direktori yang menyimpan file saat ini. Nama file yang diganti dengan string ``{}'' tidak memenuhi syarat."
find /home/mine -iname "*.png" -execdir cp {} /home/mine/pngcoppies/copy{} \;