-Exec kuru çalışmayı bul?

Dec 27 2020

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

18 rAlen Dec 27 2020 at 07:10

Bunun echo rmyerine koşabilirsinrm

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

Ayrıca bulduğu dosyaları silme seçeneğine findsahiptir-delete

3 l0b0 Dec 27 2020 at 07:28

İç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 .

2 CharlesDuffy Dec 28 2020 at 00:38

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 .