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


10

मैं वर्तमान निर्देशिका और सभी उपनिर्देशिकाओं के तहत सभी फ़ाइलों को एक निर्देशिका में एकत्र करने का प्रयास कर रहा हूं। मैं निम्नलिखित की तरह कुछ कोशिश कर रहा हूँ

find -type f -exec mv {} collection/{} \; 

उपरोक्त कमांड काम नहीं करेगा क्योंकि दूसरा {}पूरा रास्ता देता है, मैं सभी फाइलों को कैसे इकट्ठा कर सकता हूं?

जवाबों:


14

निकालें {}से mv, mvकिसी भी माता-पिता निर्देशिका अनदेखी लक्ष्य निर्देशिका के रूप में यह ले जाएगा:

find -type f -exec mv {} collection/ \;

ओह, जो मेरे साथ नहीं हुआ। धन्यवाद :)
बनी खरगोश

जैसा कि मैंने सवाल के जवाब में कहा, यह संभावित रूप से एक बुरा विचार है। शायद तर्क का उपयोग करने से -maxdepth 1मदद मिलेगी।
लोवेबॉर्ग

यह सोचने के लिए आओ, ऐसा लगता है कि मैंने आपके प्रश्न को गलत पढ़ा है :) क्षमा करें।
लोवेबॉर्ग

@loevborg: मैंने अब शीर्षक में "पुनरावर्ती" जोड़ दिया है। यदि अभी भी भ्रम है, तो कृपया इसे संपादित करें और इसमें सुधार करें :)
लेकेन्स्टाइन

1
इस उत्तर का एक तेज़ बदलाव हैfind -type f -print0|xargs -0r mv -it colection/
hildred

5

उपयोग करने के बजाय 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 'का चयन करें; .का अर्थ है" केवल नियमित रूप से फ़ाइलें, नहीं निर्देशिका "का चयन करें।


अच्छी तरह से मैं सभी उप-निर्देशिकाओं में भी पुनरावृत्ति करना चाहता था, लेकिन किसी भी तरह से जानकारी उपयोगी होने के लिए धन्यवाद, इस स्थिति में बहुत बार आते हैं :)
बनी खरगोश

वास्तव में, इसके लिए खोज ओवरकिल नहीं है, ग्लोबिंग सभी मैचों का चयन करेगा, न केवल फाइलें, बल्कि निर्देशिका भी। आप यदि प्रदर्शन वाले हैं उनमें चिंता नहीं, आप भी कुछ ऐसा इस्तेमाल कर सकते हैं: find -type f -exec mv -t collection/ {} +। यह कैसे काम करता है, इसके बारे में मैनुअल पेज से परामर्श करें।
लेकेन्स्टाइन

लेकेनस्टाइन, आप सही कह रहे हैं। मैंने अब उत्तर को अपडेट कर दिया है कि मैंने प्रश्न को समझ लिया है।
लोवेबॉर्ग

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