Jawaban:
Cara terbaik untuk melakukannya adalah dengan menggunakan parameter posisi. Dan $()yang lebih disukai untuk perintah substitusi backticks ove karena itu lebih mudah dibaca (tidak bingung dengan tanda kutip tunggal) dan dapat dengan mudah bersarang tanpa harus melakukan banyak melarikan diri.
find . -exec bash -c 'echo Blah: $(stat -c %a "$@")' _ {} \;
Garis bawah adalah pengganti untuk $0.
Untuk apa?
find ... -printf 'Blah: %m\n'
Atau gunakan bash -cjika Anda benar-benar harus:
find . -exec bash -c 'echo Blah: `stat -c %a {}`' \;
bash -catau serupa.
Satu-satunya cara untuk menggunakannya (AFAIK) adalah menempatkannya dalam file skrip bash dan menggunakan skrip di -exec. Sama halnya dengan$()
Jangan lupa xargs! Contoh Anda akan meminta proses shell baru untuk setiap file yang ditemukan.
Saya lebih suka ini:
find ... | xargs stat -c "Blah: %a"
findmenampilkan daftar semua yang ditemukan, xargsmembaca daftar argumen di stdindan mengeksekusi parameternya dengan argumen-argumen di baris perintah, membangun selama baris perintah mungkin. Ini bekerja karena stat, seperti kebanyakan perintah / program lain yang tepat, mengambil sejumlah parameter. (bandingkan ls, rmdan echomisalnya)
Jika Anda merasa perlu untuk meluncurkan proses baru untuk setiap file, gunakan xargs -n 1hanya untuk mengirimkan 1parameter ke setiap perintah. Dengan begitu Anda dapat meniru metode yang tidak efisien seperti ini:
find ... | xargs -n 1 stat -c "Blah: %a"
(Cobalah di sistem file besar di komputer yang lambat dan pertahankan waktu perbedaannya!)
findbahkan dieksekusi dan hasilnya digunakan sebagai parameter statis untuk find.