-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 a
dizin içinden test etmenin bir yolu var mı?
rm 1.txt
rm 2.txt
rm b/3.txt
Güncelleme Notu: rm
sadece örnek bir komuttur, genel durumla ilgileniyorum
Yanıtlar
Bunun echo rm
yerine koşabilirsinrm
find . type f -exec echo rm {} \;
Ayrıca bulduğu dosyaları silme seçeneğine find
sahiptir-delete
İçin rm
belirtmek gerekirse gerekmez -exec
: sadece çalıştırmak find . -type f
listeye 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, rm
rastgele 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 -exec
tam 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 zsh
veya ksh
yerine koyabilirsiniz .