* Nix में पैरेंट फोल्डर में सबफ़ोल्डर में (छिपी सहित) सभी फ़ाइलों को पुन: कैसे स्थानांतरित किया जाए?


14

यह थोड़ा शर्मनाक सवाल है, लेकिन मुझे यह स्वीकार करना होगा कि मेरे करियर में इस देरी के बाद भी मेरे पास कमांड के बारे में सवाल हैं।

मुझे अक्सर यह समस्या होती है: मुझे सभी फ़ाइलों को एक स्तर पर पुनरावर्ती रूप से स्थानांतरित करने की आवश्यकता है। मान लीजिए कि मेरे पास फ़ोल्डर फू है, और इसके अंदर एक फ़ोल्डर बार है। बार में फ़ाइलों और फ़ोल्डरों की एक गड़बड़ है, जिसमें डॉट फाइलें और फ़ोल्डर्स शामिल हैं। मैं बार में सब कुछ फू स्तर पर कैसे ले जाऊं?

अगर फू खाली है, तो मैं बस बार को एक स्तर ऊपर ले जाता हूं, फू को हटा देता हूं और फू में नाम बदल देता हूं। समस्या का हिस्सा यह है कि मैं यह नहीं जान सकता कि "डॉट्स सहित सब कुछ" के लिए एमवी के वाइल्डकार्ड क्या है। इस प्रश्न का एक हिस्सा यह है - वाइल्डकार्ड की गहन चर्चा है कि cp और mv कमांड कहीं न कहीं उपयोग करते हैं (यह केवल बहुत ही मूल ट्यूटोरियल लाता है)।

जवाबों:


19

बैश (और कुछ अन्य) में, आप इसे एक पंक्ति में पूरा करने के लिए ब्रेस विस्तार का उपयोग कर सकते हैं:

mv bar/{,.}* .

अल्पविराम एक अशक्त और एक बिंदी को अलग करता है, इसलिए mvकमांड उस मैच *और फ़ाइल नाम देखता है.*


यह '..' को स्थानांतरित करने का प्रयास करता है, संदेश के साथ विफल रहता है 'संसाधन व्यस्त है'। फिर भी काम करता है।
Xananax

3
अनाम उपयोगकर्ता द्वारा सुझाया गया:To eliminate the error caused by also matching "." and "..", use this command: mv bar/{,.[!.],..?}* .
HoplessN00b

2

ऐसा करने का सबसे आसान तरीका यह है कि इसे दो कमांड में किया जाए, क्योंकि * यह मेल नहीं खाता

cd /foo
mv bar/* ./
mv bar/.??* ./

आप बार /। का उपयोग नहीं करना चाहते हैं, जो मुझे यह गलती करते हुए पता चला है:

rm -rf ./.* 

यह बुरी बात है। कोई भी अनुमान लगाना चाहता है कि क्यों? ;-)


मुझे नहीं लगता कि बैश या Zsh फैलता है .*करने के लिए .और ..। Zsh मेरे लिए कम से कम नहीं है।
मिकेल एस

मिकेल: मैं वादा कर सकता हूं कि बैश करता है (या कम से कम किया था), जैसा कि मुझे उपयोगकर्ता निर्देशिकाओं को पुनर्प्राप्त करना था जिसे मैंने बस करने से मिटा दिया था
मैट सिमंस

2

ग्लोबिंग के बारे में जानने वाली पहली बात - यह शेल द्वारा किया गया है, कमांड नहीं। सभी विवरणों के लिए अपने शेल का मैन पेज देखें।


2

यह एक सबफ़ोल्डर्स से सभी फाइलों की कटाई करता है और उन्हें वर्तमान dir में स्थानांतरित करता है

find . -type f -exec mv -iv \{} . \;

यदि आप समान नाम वाली फ़ाइलों का उपयोग करना चाहते हैं, तो उपयोग करें

yes y | find . -type f -exec mv -iv \{} . \;

1

mv .??* *किसी एक पात्र के बाद डॉट को छोड़कर किसी भी चीज़ का ध्यान रखेगा। यदि यह आपकी स्थिति के लिए सामान्य है, तो आप जोड़ सकते हैं .[a-zA-Z0-9]*। यही कारण है कि अभी भी इस तरह के रूप में नाम के साथ फ़ाइलों को छोड़ देंगे .;, .^और .^I(टैब)। यदि आपको सब कुछ संभालने की आवश्यकता है, तो आपको थोड़ा और जटिल होने की आवश्यकता होगी।

mv .. `ls -f | egrep -v '^.$|^..$'

0

यदि आपके पास एक निर्देशिका संरचना है /foo/bar/और आप barउपरोक्त सभी फाइलों को एक कदम के नीचे ले जाना चाहते हैं, तो barनिर्देशिका में जाएँ और निम्नलिखित टाइप करें:

find . -depth -print0 | cpio --null -pvd ../

आम तौर पर, मुझे लगता cpio(1)है कि इस तरह के कार्यों के लिए बेहतर है। आप info cpioअपने शेल में जारी करके विस्तृत दस्तावेज देख सकते हैं ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.