-Exec kuru çalışmayı bul?
find . -exec somecommand {} \;Komutları gerçekten çalıştırmadan, ikamelerin sonucunun ne olacağını görmenin bir yolu var mı ? Kuru çalıştırma (veya test çalıştırması veya baskı) gibi mi?
Örneğin, aşağıdaki dosya yapısına sahip olduğumu varsayalım:
/a/1.txt
/a/2.txt
/a/b/3.txt
Çıktının stdout'a yazdırılacağı ancak çalıştırılmayacağı find . type f -exec rm {} \;şekilde adizin içinden test etmenin bir yolu var mı?
rm 1.txt
rm 2.txt
rm b/3.txt
Güncelleme Notu: rmsadece örnek bir komuttur, genel durumla ilgileniyorum
Yanıtlar
Bunun echo rmyerine koşabilirsinrm
find . type f -exec echo rm {} \;
Ayrıca bulduğu dosyaları silme seçeneğine findsahiptir-delete
İçin rmbelirtmek gerekirse gerekmez -exec: sadece çalıştırmak find . -type flisteye ve ekleyin -delete(besbelli eşleşen herhangi dosyaları bu arada silinmiş / yaratılıyor engelleme) Önceki komutu tarafından listelenen dosyaları silmek için.
Ayrıca, rmrastgele sayıda argüman \;alan +komutlar için, mümkün olduğunca az komut çalıştırmak üzere değiştirmek isteyeceksiniz .
Biraz ağız dolusu, ancak kullanan yaklaşımların aksine echo, aşağıdaki kod çıktıları, dosya adlarınız tırnak işaretleri, boşluklar, kabuk meta karakterleri vb. İçerse bile, doğru sonucu elde etmek için herhangi bir değişiklik yapmadan kabuğunuzda çalıştırabilirsiniz.
printcmd() { printf '%q ' "$@"; printf '\n'; } find . -exec bash -c "$(declare -f printcmd); "'printcmd "$@"' _ \
somecommand {} \;
Argümanımızın başına eklediğimiz dizenin -exectam olarak olduğuna dikkat edin bash -c "$(declare -f printcmd); "'printcmd "$@"' _- $(declare -f printcmd)işlevin koduna genişler; bundan sonra , fonksiyonu argümanlar ve ileriye doğru çağırırız$1 ve yerine _yer tutucu koyarız $0.
Bu kabuk için çıktının kaçmasını istiyorsanız bash yerine zshveya kshyerine koyabilirsiniz .