Saya mencoba menjalankan perintah yang mirip dengan yang di bawah ini dalam skrip bash. Itu harus mencari melalui semua subfolder $sourcedir
dan menyalin semua file dari jenis tertentu ke tingkat root $targetdir
.
#!/bin/bash
# These are set as arguments to the script, not hard-coded
sourcedir="/path/to/sourcedir"
targetdir="/path/to/targetdir"
find "$sourcedir" -type f -name "*.type" -exec sh -c 'cp "$1" "$2/`basename "$1"`"' "{}" "$targetdir" \;
Hal ini tampaknya menjadi cukup dekat, kecuali bahwa {}
tidak sedang dilewatkan sebagai $2
untuk-exec sh -c ...
Saya ingin melakukan ini sedekat mungkin dengan "jalan yang benar", dengan toleransi untuk karakter khusus dalam nama file (khususnya karakter kutipan tunggal).
Sunting: Saya melihat orang-orang menyarankan menggunakan xargs
atau chaining argumen. Saya mendapat kesan bahwa ini hanya ok untuk sejumlah argumen. Jika saya memiliki, misalnya, ribuan file .jpg yang saya coba salin dari sejumlah direktori galeri ke direktori rangkai salindia raksasa, akankah solusi chaining argumen masih berfungsi?
Sunting 2: Masalah saya adalah saya tidak memiliki _
sebelum opsi pertama saya untuk sh dalam -exec
perintah. Bagi siapa saja yang ingin tahu tentang cara membuat perintah find berfungsi, tambahkan _
dan semuanya akan baik-baik saja:
find "$sourcedir" -type f -name "*.type" -exec sh -c 'cp "$1" "$2"' _ "{}" "$targetdir" \;
Saya telah menerima jawaban di bawah ini karena itu menyelesaikan tugas yang sama, tetapi lebih efisien dan elegan.
xargs
pernah dibuat, untuk secara otomatis menangani sejumlah besar argumen pada perintah reguler yang memiliki batas. Juga untuk mempertimbangkan, sebagian besar batasan argumen maks, telah jauh ditingkatkan untuk utilitas GNU standar. Anda juga akan melihat manfaat kinerja, menghindari semua proses garpu, yang pada ribuan file relevan.