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 a
direktori sedemikian rupa sehingga output akan dicetak ke stdout tetapi tidak dieksekusi seperti:
rm 1.txt
rm 2.txt
rm b/3.txt
Pembaruan Catatan: rm
hanyalah contoh perintah, saya tertarik pada kasus umum
Jawaban
Anda dapat menjalankan echo rm
sebagai gantinyarm
find . type f -exec echo rm {} \;
Juga, find
memiliki -delete
opsi untuk menghapus file yang ditemukannya
Secara rm
khusus, Anda tidak perlu -exec
: cukup lari find . -type f
ke daftar, dan tambahkan -delete
untuk menghapus file yang terdaftar dengan perintah sebelumnya (jelas melarang file yang cocok dibuat / dihapus sementara itu).
Juga, untuk perintah seperti rm
yang 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 -exec
argumen 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 $1
dan seterusnya, dan meletakkan _
sebagai tempat penampung untuk $0
.
Anda dapat mengganti zsh
atau ksh
sebagai pengganti bash, jika Anda ingin keluaran lolos untuk shell itu.