rsync regex नहीं बोलता है। आप खोज और grep को सूचीबद्ध कर सकते हैं, हालांकि यह थोड़ा रहस्यमय हो जाता है। लक्ष्य फ़ाइलों को खोजने के लिए:
find a/ |
grep -i 'name'
लेकिन वे सभी "/ a" के साथ उपसर्ग कर रहे हैं - जो समझ में आता है, लेकिन जो हम समाप्त करना चाहते हैं वह rsync के लिए स्वीकार्य पैटर्न को शामिल करने की एक सूची है, और "r /" के लिए "a /" उपसर्ग काम नहीं करता है ' इसे कट के साथ हटा देंगे:
find . |
grep -i 'name' |
cut -d / -f 2-
अभी भी एक समस्या है - हम अभी भी उपनिर्देशिकाओं में फ़ाइलों को याद करेंगे, क्योंकि rsync बाहर की सूची में निर्देशिका नहीं खोजता है। मैं किसी भी मेल खाने वाली फ़ाइल की उपनिर्देशिकाओं को शामिल करने के लिए awk का उपयोग करने जा रहा हूँ, जिसमें शामिल हैं पैटर्न:
find a/ |
grep -i 'name' |
cut -d / -f 2- |
awk -F/ '{print; while(/\//) {sub("/[^/]*$", ""); print}}'
सभी को छोड़ दिया जाता है कि सूची को rsync पर भेजना है - हम मानक इनपुट पर rsync को पैटर्न की सूची प्रदान करने के लिए तर्क --include-from = का उपयोग कर सकते हैं। तो, कुल मिलाकर:
find a/ |
grep -i 'name' |
cut -d / -f 2- |
awk -F/ '{print; while(/\//) {sub("/[^/]*$", ""); print}}' |
rsync -avvz --include-from=- --exclude='*' ./a/ ./b/
ध्यान दें कि स्रोत निर्देशिका 'a' को दो अलग-अलग रास्तों - "a /" और "./a/" के माध्यम से संदर्भित किया जाता है। यह सूक्ष्म लेकिन महत्वपूर्ण है। चीजों को अधिक सुसंगत बनाने के लिए मैं एक अंतिम परिवर्तन करने जा रहा हूं, और हमेशा स्रोत निर्देशिका को "./a/" के रूप में संदर्भित करता हूं। हालांकि, इसका मतलब है कि कट कमांड को बदलना होगा क्योंकि परिणाम से सामने वाले स्थान पर "./" होगा:
find ./a/ |
grep -i 'name' |
cut -d / -f 3- |
awk -F/ '{print; while(/\//) {sub("/[^/]*$", ""); print}}' |
rsync -avvz --include-from=- --exclude='*' ./a/ ./b/
--exclude='*'
?