फाइंड -सेक ड्राई रन?
वहाँ 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
केवल एक उदाहरण आदेश है, मैं सामान्य मामले में रुचि रखता हूं
जवाब
आप के echo rm
बजाय चला सकते हैंrm
find . type f -exec echo rm {} \;
इसके अलावा, find
इसमें -delete
मिली फ़ाइलों को हटाने का विकल्प है
के लिए rm
विशेष रूप से, आप की जरूरत नहीं है -exec
: बस चलाने find . -type f
की सूची पर है, और जोड़ने -delete
पिछला आदेश (जाहिर है को छोड़कर किसी भी मिलान फ़ाइलें बनाई / बीच में नष्ट कर दिया जा रहा है) के आधार पर सूचीबद्ध फ़ाइलों को हटाना।
इसके अलावा, ऐसे आदेशों के लिए rm
जो मनमानी संख्या में तर्क लेते हैं , जिन्हें आप कम से कम आदेशों के \;
साथ बदलना चाहेंगे +
।
यह थोड़ा सा कौर है, लेकिन उपयोग करने के दृष्टिकोण के विपरीत 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
बैश के बजाय, यदि आप चाहते हैं कि आउटपुट उस शेल के लिए बच जाए।