फाइंड -सेक ड्राई रन?

Dec 27 2020

वहाँ find . -exec somecommand {} \;वास्तव में आदेशों को चलाने के बिना, प्रतिस्थापन के साथ क्या होगा देखने का एक तरीका है ? ड्राई रन (या टेस्ट रन या प्रिंट) की तरह?

उदाहरण के लिए, मान लें कि मेरे पास निम्न फ़ाइल संरचना है:

/a/1.txt
/a/2.txt
/a/b/3.txt

क्या डायरेक्टरी के find . type f -exec rm {} \;भीतर से परीक्षण करने का कोई तरीका है aजैसे कि आउटपुट को stdout में प्रिंट किया जाएगा, लेकिन इसे निष्पादित नहीं किया जाएगा:

rm 1.txt
rm 2.txt
rm b/3.txt

अद्यतन नोट: rmकेवल एक उदाहरण आदेश है, मैं सामान्य मामले में रुचि रखता हूं

जवाब

18 rAlen Dec 27 2020 at 07:10

आप के echo rmबजाय चला सकते हैंrm

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

इसके अलावा, findइसमें -deleteमिली फ़ाइलों को हटाने का विकल्प है

3 l0b0 Dec 27 2020 at 07:28

के लिए rmविशेष रूप से, आप की जरूरत नहीं है -exec: बस चलाने find . -type fकी सूची पर है, और जोड़ने -deleteपिछला आदेश (जाहिर है को छोड़कर किसी भी मिलान फ़ाइलें बनाई / बीच में नष्ट कर दिया जा रहा है) के आधार पर सूचीबद्ध फ़ाइलों को हटाना।

इसके अलावा, ऐसे आदेशों के लिए rmजो मनमानी संख्या में तर्क लेते हैं , जिन्हें आप कम से कम आदेशों के \;साथ बदलना चाहेंगे +

2 CharlesDuffy Dec 28 2020 at 00:38

यह थोड़ा सा कौर है, लेकिन उपयोग करने के दृष्टिकोण के विपरीत echo, नीचे दिए गए आउटपुट कोड आप अपने शेल में चला सकते हैं बिना किसी सही परिवर्तन के, भले ही आपके फ़ाइलनाम में उद्धरण, रिक्त स्थान, शेल मेटाचैकर, आदि हों।

printcmd() { printf '%q ' "$@"; printf '\n'; } find . -exec bash -c "$(declare -f printcmd); "'printcmd "$@"' _ \
  somecommand {} \;

ध्यान दें कि हम अपने -execतर्क के लिए जिस स्ट्रिंग का उपयोग कर रहे हैं वह ठीक है bash -c "$(declare -f printcmd); "'printcmd "$@"' _- $(declare -f printcmd)फ़ंक्शन के लिए कोड तक फैलता है; उसके बाद, हम वास्तव में फ़ंक्शन को तर्कों $1और आगे की ओर कहते हैं, और इसके _लिए प्लेसहोल्डर के रूप में डालते हैं $0

आप विकल्प zshया kshबैश के बजाय, यदि आप चाहते हैं कि आउटपुट उस शेल के लिए बच जाए।