उपयोग करने के बजाय find
(जो काम अच्छी तरह से करता है), आप इस छोर तक शेल का उपयोग भी कर सकते हैं।
मान लें कि आप $ PWD से $ DEST तक की सभी फाइलें चाहते हैं। प्राकृतिक प्रयास होगा:
mv $PWD/* $DEST
यह कैसे काम करता है? "$ पीडब्ल्यूडी / *" अभिव्यक्ति उस निर्देशिका में सभी फाइलों के नाम तक फैलती है। इस शेल सुविधा को "ग्लोबिंग" कहा जाता है। mv
गंतव्य निर्देशिका का अंतिम तर्क है। यदि आपके पास बहुत सारी फाइलें हैं, तो यह काम नहीं करेगा क्योंकि कमांड लाइन की लंबाई सीमित है।
लेकिन समाधान में यह समस्या है कि यह डॉट फ़ाइलों को छोड़ देता है - या "छिपी हुई" फाइलें, फाइलें और निर्देशिकाएं जिनका नाम "" के साथ शुरू होता है। इसे हल करने के लिए, आपको ग्लोबिंग करते समय अपने शेल को डॉटफिल्स शामिल करने के लिए कहना होगा। ऐसा करने के लिए, का उपयोग करें
shopt -s dotglob
उपयोग करते समय bash
(और आप शायद bash
तब तक उपयोग करते हैं जब तक आपने डिफ़ॉल्ट बदल नहीं दिया हो)। इस शेल में, उपरोक्त कमांड डॉटफाइल्स के लिए भी काम करेगा।
एक तरफ के रूप में zsh
, आपके पास यह मामला-दर-मामला आधार पर चुनने का विकल्प है। ऐसा करने के लिए, डाल दिया
setopt extendedglob
अपने में .zshrc
। तब आप उपयोग कर सकते हैं
mv $PWD/*(D) $DEST
dotfiles सहित सभी फ़ाइलों को स्थानांतरित करने के लिए। ("D" में "GLOB_DOTS" विकल्प को अस्थायी रूप से सक्षम करने का प्रभाव है)।
अब मूल प्रश्न सभी उपनिर्देशिकाओं और उनकी उपनिर्देशिकाओं से सभी नियमित फ़ाइलों (निर्देशिकाओं) को एक निर्देशिका में स्थानांतरित करना था। इससे पूरा किया जा सकता है zsh
:
mv $PWD/**/*(D.)
यहां अभिव्यक्ति **/*
ग्लोब को अवरोही रूप से उपनिर्देशिका में बनाती है। D
इसका मतलब है "भी dotfiles 'का चयन करें; .
का अर्थ है" केवल नियमित रूप से फ़ाइलें, नहीं निर्देशिका "का चयन करें।