सब स्क्रिप्टर्स से पैरेंट फोल्डर में जाने के लिए शेल स्क्रिप्ट


47

मैंने फ़ोल्डर में फ़ोल्डर्स का गुच्छा लिया है A। मैं उन सभी फ़ोल्डरों से फाइल को स्थानांतरित करना चाहता हूं A

या

मैं चाइल्ड फोल्डर की सभी फाइलों को काटकर पेरेंट फोल्डर में पेस्ट करना चाहता हूं।

उसको कैसे करे?


1
मैंने वास्तव में इसे मूर्खतापूर्ण या कुछ भी परीक्षण नहीं किया है, लेकिन क्या आपने किसी टर्मिनल में फ़ोल्डर ए से इस कमांड को दर्ज करने की कोशिश की है mv */* .:?
मार्टी फ्राइड

क्या आप सुनिश्चित हैं कि कोई डुप्लिकेट फ़ाइल नाम नहीं हैं?
जिप्पी

mv */* .सबफ़ोल्डर्स सबफ़ोल्डर से फ़ाइलों को स्थानांतरित नहीं करेगा।
राहुल वीरपारा

@ जिप्पी हां, कोई डुप्लिकेट नाम नहीं हैं
राहुल वीरपारा

जवाबों:


81

अपनी Aनिर्देशिका पर जाएं और चलाएं

find . -mindepth 2 -type f -print -exec mv {} . \;

जिसका अर्थ है "इस निर्देशिका और इसके उप-निर्देशिकाओं में सभी फ़ाइलें ढूंढें और लक्ष्य निर्देशिका के साथ mv निष्पादित करें। प्रत्येक फ़ाइल के लिए उन्हें वर्तमान निर्देशिका में ले जाने के लिए मिला।


1
यह उन फ़ाइलों को स्थानांतरित करने का भी प्रयास करता है जो पहले से ही मूल निर्देशिका में हैं।
राहुल वीरपारा

virpara: अब यह आपका संस्करण .dot निर्देशिकाओं की सभी फाइलों को भूल जाता है। चेतावनी को दबाने के बजाय इसे -mindepth 2 के साथ संशोधित किया।
तुम्मीनिद

1
जीएनयू के साथ findआप थोड़ा और अधिक सुंदर हो सकते हैं और mvप्रत्येक फ़ाइल के लिए एक प्रक्रिया नहीं कर सकते हैं :find A -mindepth 2 -type f -exec mv -t A \{\} +
डेविड फ़ॉस्टर

डेविड, आपका संस्करण तब तक काम करता है जब तक कि आप अधिकतम कमांड लाइन की लंबाई की सीमा को नहीं मारते, जो कि ऐसा करना मुश्किल नहीं है कि रास्तों को कैसे प्रिंट करें, विशेष रूप से उस स्थिति में जहां आप इसे अपने उदाहरण की तरह, ए के अलावा किसी अन्य निर्देशिका से प्राप्त करते हैं।
तुम्मीनिद सिप

9
यह बहुत खतरनाक है। यदि आपके पास अलग-अलग सबफ़ोल्डर्स में एक ही फ़ाइल नाम वाली फाइलें हैं, तो आप अंतिम खोज के साथ इन सभी को ओवरराइट कर देंगे। find . -mindepth 2 -type f -print -exec mv --backup=numbered {} . \;
Mv

4

वैसे आप एक फ़ाइल बना सकते हैं और इसे "cutme" नाम दे सकते हैं (टर्मिनल प्रकार में cutme नामक एक फाइल बनाने के लिए nano cutme। इसे बचाने के लिए CTRL + X दबाएं, उदाहरण के लिए ENTER दबाएं।) और यह मानते हुए निम्नलिखित को चिपकाएँ:

  1. आप इसे पुनरावर्ती रूप से करना चाहते हैं (उन सबफ़ोल्डर्स के सबफ़ोल्डर्स और सबफ़ोल्डर्स में)
  2. आप स्क्रिप्ट फ़ाइल को स्थानांतरित करना छोड़ना चाहते हैं
  3. आपके पास उस फ़ोल्डर में फ़ाइलों को स्थानांतरित करने की अनुमति है
  4. फ़ाइलें उनके नाम में स्थान शामिल कर सकती हैं या नहीं भी

find * -type f -print -not -type d -and -not -regex 'cutme' -exec mv {} .. \;

लाइन के अंदर नाम कटे नोट करें । यह उसी तरह होना चाहिए जिस तरह की स्क्रिप्ट आप चलाएंगे।

फ़ाइल बनाने और उपरोक्त पंक्ति को चिपकाने के बाद, स्क्रिप्ट के समान फ़ोल्डर में निम्न चलाएँ:

chmod +x cutme। यह आपकी नई फ़ाइल को "निष्पादन योग्य" ध्वज देगा ताकि आप इसे इस तरह निष्पादित कर सकें ./cutme:।


मुझे उन फ़ाइलों को स्थानांतरित करने का प्रयास क्यों करना चाहिए जो पहले से ही मूल निर्देशिका में हैं?
राहुल वीरपारा

आप फ़ोल्डर के अंदर से स्क्रिप्ट चलाएंगे। इसमें हर फाइल, अगर सबफ़ोल्डर के अंदर है या फ़ोल्डर के पैरेंट फ़ोल्डर में नहीं जाएगी। जहां स्क्रिप्ट है, उसके संबंध में पैरेंट फोल्डर यहां पैरेंट है। वास्तव में अंतिम 2 डॉट्स को बदलकर आप बता सकते हैं कि फ़ोल्डर के अंदर सभी फ़ाइलों को स्थानांतरित करने के लिए जहां आप स्क्रिप्ट चलाते हैं।
लुइस अल्वाराडो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.