Cari dry run -exec?

Dec 27 2020

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

18 rAlen Dec 27 2020 at 07:10

Anda dapat menjalankan echo rmsebagai gantinyarm

find . type f -exec echo rm {} \;

Juga, findmemiliki -deleteopsi untuk menghapus file yang ditemukannya

3 l0b0 Dec 27 2020 at 07:28

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.

2 CharlesDuffy Dec 28 2020 at 00:38

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.