मैं '{}' का उपयोग कैसे कर सकता हूँ कि खोज के -exec विकल्प के माध्यम से चलने वाले कमांड के आउटपुट को पुनर्निर्देशित करें?


26

मैं svnadmin dumpएक बैकअप स्क्रिप्ट के लिए एक कमांड को स्वचालित करने की कोशिश कर रहा हूं , और मैं कुछ इस तरह करना चाहता हूं:

find /var/svn/* \( ! -name dir -prune \) -type d -exec svnadmin dump {} > {}.svn \;

यह काम करने लगता है, इसमें यह प्रत्येक svn रिपॉजिटरी के माध्यम से दिखता है /var/svn, और इस svnadmin dumpपर चलता है।

हालाँकि, {}निष्पादन आदेश में दूसरा संसाधित होने वाली निर्देशिका के नाम के लिए प्रतिस्थापित नहीं किया जाता है। यह मूल रूप से केवल एक एकल फ़ाइल का नाम देता है {}.svn

मुझे संदेह है कि ऐसा इसलिए है क्योंकि शेल कमांड >को समाप्त करने के लिए व्याख्या findकरता है, और यह उस कमांड से रीडायरेक्टिंग को नामांकित फ़ाइल तक पहुंचाने की कोशिश करता है {}.svn

कोई विचार?

जवाबों:


36

आप इस तरह से पुनर्निर्देशन कर सकते हैं:

find /var/svn/* \( ! -name dir -prune \) -type d -exec sh -c 'svnadmin dump {} > {}.svn' \;

और सही प्रतिस्थापन किया जाएगा।


यह त्रुटिपूर्ण और बुरी प्रथा है। मेरे इस जवाब की तुलना करें । सही तरीके से पारित करने के लिए है {}करने के लिए एक तर्क के रूप shऔर उसके बाद (अंदर sh) ही कहते हैं "$0"या "$1"या तो।
कामिल मैकियोरोवस्की

5

नहीं, हालाँकि आप इसे करने के लिए एक सरल बैश स्क्रिप्ट लिख सकते हैं, फिर इसे ढूंढने से बुला सकते हैं।
उदाहरण ( /tmp/dump.sh ):

#!/bin/sh
svn admin dump "$1" > "$1".svn

फिर:

find /var/svn/* \( ! -name dir -prune \) -type d -exec sh /tmp/dump.sh '{}' \;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.