Cari dry run -exec?
Adakah cara untuk melihat hasil dari a find . -exec somecommand {} \;dengan substitusi, tanpa benar-benar menjalankan perintah? Seperti uji coba (atau uji coba atau cetak)?
Misalnya, saya memiliki struktur file berikut:
/a/1.txt
/a/2.txt
/a/b/3.txt
Apakah ada cara untuk menguji find . type f -exec rm {} \;dari dalam adirektori sedemikian rupa sehingga output akan dicetak ke stdout tetapi tidak dieksekusi seperti:
rm 1.txt
rm 2.txt
rm b/3.txt
Pembaruan Catatan: rmhanyalah contoh perintah, saya tertarik pada kasus umum
Jawaban
Anda dapat menjalankan echo rmsebagai gantinyarm
find . type f -exec echo rm {} \;
Juga, findmemiliki -deleteopsi untuk menghapus file yang ditemukannya
Secara rmkhusus, Anda tidak perlu -exec: cukup lari find . -type fke daftar, dan tambahkan -deleteuntuk menghapus file yang terdaftar dengan perintah sebelumnya (jelas melarang file yang cocok dibuat / dihapus sementara itu).
Juga, untuk perintah seperti rmyang mengambil jumlah yang sewenang-wenang argumen Anda akan ingin mengganti \;dengan +berjalan seperti beberapa perintah mungkin.
Ini sedikit rumit, tetapi tidak seperti pendekatan yang digunakan echo, kode keluaran di bawah ini dapat Anda jalankan di shell Anda tanpa perubahan apa pun untuk mendapatkan hasil yang benar, bahkan ketika nama file Anda berisi tanda kutip, spasi, metakarakter shell, dll.
printcmd() { printf '%q ' "$@"; printf '\n'; } find . -exec bash -c "$(declare -f printcmd); "'printcmd "$@"' _ \
somecommand {} \;
Perhatikan bahwa string yang kami persiapkan ke -execargumen kami tepat bash -c "$(declare -f printcmd); "'printcmd "$@"' _- $(declare -f printcmd)perluasan ke kode untuk fungsi; setelah itu, kita benar-benar memanggil fungsi dengan argumen $1dan seterusnya, dan meletakkan _sebagai tempat penampung untuk $0.
Anda dapat mengganti zshatau kshsebagai pengganti bash, jika Anda ingin keluaran lolos untuk shell itu.