Apakah mungkin untuk mendapatkan "find -exec" memperluas backticks untuk setiap file yang ditemukan?

9

Inilah perintah yang berfungsi dengan baik:

echo Blah: `stat -c %a .`

Apakah mungkin untuk find -execmengeksekusi hal yang sama untuk setiap file yang ditemukan, dengan {}menggantikan .?

RomanSt
sumber
1
Backticks tidak dapat berfungsi di sana karena dievaluasi sekali sebelum findbahkan dieksekusi dan hasilnya digunakan sebagai parameter statis untuk find.
Sven

Jawaban:

10

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.

Dijeda sampai pemberitahuan lebih lanjut.
sumber
6

Untuk apa?

find ... -printf 'Blah: %m\n'

Atau gunakan bash -cjika Anda benar-benar harus:

 find . -exec bash -c 'echo Blah: `stat -c %a {}`' \;
Ignacio Vazquez-Abrams
sumber
Terima kasih telah memecahkan masalah langsung saya, tetapi saya masih penasaran untuk mengetahui apakah backticks dapat digunakan seperti yang dijelaskan. Hanya untuk memperluas wawasan saya.
RomanSt
Anda harus meminta shell melalui bash -catau serupa.
Ignacio Vazquez-Abrams
0

Satu-satunya cara untuk menggunakannya (AFAIK) adalah menempatkannya dalam file skrip bash dan menggunakan skrip di -exec. Sama halnya dengan$()

Hubert Kario
sumber
0

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!)

MattBianco
sumber
Saya menghargai upaya ini, tetapi saya perlu backticks itu. Jelas contoh saya disederhanakan dan menggunakan echo + stat; skrip asli tidak menggunakan gema atau stat, jadi trik Anda untuk menyatukannya ke dalam format string stat tidak membantu sama sekali.
RomanSt