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 -c
jika Anda benar-benar harus:
find . -exec bash -c 'echo Blah: `stat -c %a {}`' \;
bash -c
atau 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"
find
menampilkan daftar semua yang ditemukan, xargs
membaca daftar argumen di stdin
dan 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
, rm
dan echo
misalnya)
Jika Anda merasa perlu untuk meluncurkan proses baru untuk setiap file, gunakan xargs -n 1
hanya untuk mengirimkan 1
parameter 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!)
find
bahkan dieksekusi dan hasilnya digunakan sebagai parameter statis untuk find.