विशिष्ट नाम पैटर्न के साथ लाखों फाइलों को एक अलग निर्देशिका में ले जाना


10

मेरे पास लिनक्स मशीन पर निम्नलिखित नामकरण के साथ लाखों फाइलें हैं:

1559704165_a1ac6f55fef555ee.jpg

पहले 10 अंक टाइमस्टैम्प हैं और उसके बाद _विशिष्ट आईडी हैं। मैं विशिष्ट फ़ाइल नाम से मेल खाते सभी फ़ाइलों को एक अलग फ़ोल्डर में ले जाना चाहता हूं।

मैं फ़ाइलों के साथ निर्देशिका पर यह कोशिश की

find . -maxdepth 1 -type f | ??????????_a1ac*.jpg |xargs mv -t "/home/ubuntu/ntest"

हालाँकि मुझे संकेत मिलने में त्रुटि हो रही है:

bash 1559704165_a1ac6f55fef555ee.jpg: command not found

जब मैंने कोशिश की, तो mv ??????????_a1ac*.jpg मुझे तर्क सूची बहुत लंबी त्रुटि मिल रही है। मेरे पास 15 अलग-अलग फ़ाइलनाम पैटर्न हैं। मैं उन्हें कैसे आगे बढ़ाऊं।


1
बैश यह सब कहता है: यह उस फ़ाइल नाम को निष्पादित करने की कोशिश करता है क्योंकि यह पाइप के दूसरे चरण में लाइन पर पहला है (आपका दूसरा चरण पाइप है | ??????????_a1ac*.jpg:: बैश का विस्तार कई फ़ाइल नाम के लिए होता है, पहले जा रहा है 1559704165_a1ac6f55fef555ee.jpg, सी आप इसे पूरा करते हैं। उस 2 वें चरण में, निष्पादित करने की कोशिश कर रहा है: 1559704165_a1ac6f55fef555ee.jpg next_matching_filename 3rd_matching_filename ... nth_matching_filenameमुझे लगता है कि आपने उस फ़ाइलनाम को फ़िल्टर करने के लिए इसके बजाय कोशिश की है (उस के लिए नीचे दिए गए उत्तर देखें)
ओलिवियर दुलक

जवाबों:


15

आपको उपयोग करना चाहिए:

find . -maxdepth 1 -type f -name '??????????_a1ac*.jpg' \
-exec mv -t destination "{}" +

तो maxdepth 1इसका मतलब है कि आप वर्तमान निर्देशिका में कोई उपनिर्देशिका खोज करना चाहते हैं।

type f इसका मतलब केवल फाइलें ढूंढना है।

name '??????????_a1ac*.jpg' एक पैटर्न है जो उस फ़ाइल से मेल खाता है जिसे आप खोज रहे हैं।

mv -t destination "{}" +का अर्थ है गंतव्य के लिए मिलान की गई फ़ाइलें। यहां +नई मिलान की गई फ़ाइलों को पिछले एक की तरह जोड़ा जाता है:

mv -t dest a b c d

यहाँ abcd अलग अलग फाइल है।


इस व्यक्ति के प्रश्न का उत्तर देने के लिए धन्यवाद। केवल एक समाधान डंप करने के बजाय, शायद आप बता सकते हैं कि कैसे / क्या / क्यों। एक व्यक्ति, एक समय के लिए उपयोगी होने के बजाय, यह हर किसी के लिए उपयोगी हो सकता है। पिछले 40-50 वर्षों में एक ही सवाल पूछा गया है और अनगिनत बार जवाब दिया गया है। समस्या यह है, यह कभी अच्छी तरह से समझाया गया है। एक आदमी को मछली सिखाना .. इस बीच में: gnu.org/software/findutils/manual/html_node/find_html/… और जैसा कि अक्सर आधिकारिक विकिपीडिया की तुलना में विकिपीडिया के अधिक उपयोगी होता है: en.wikipedia.org/wiki/Find_ ( यूनिक्स)
आवाज देता है

अद्यतन उत्तर देखें।
प्रात_वायद

ध्यान दें कि -tएक GNU एक्सटेंशन है और इसलिए यह UNIX डेरिवेटिव के अन्य प्रकारों पर उपलब्ध नहीं हो सकता है।
केविन

जब आप कहते हैं "डबल कोट्स शब्द विभाजन को रोकता है।" मुझे लगता है कि आप का उल्लेख कर रहे हैं "{}", जिस मामले में मैं इंगित करना चाहता हूं कि {}शेल द्वारा विस्तार नहीं किया गया है और उद्धृत करने की आवश्यकता नहीं है। शेल {}खोजने के लिए गुजरता है, और देखता है {}और पाथने के साथ इसे बदलता है। ढूँढें निष्पादन शेल पार्सर का उपयोग नहीं करता है और अपने स्वयं के शब्द-विभाजन को नहीं करता है। इसे उद्धृत करने से कोई नुकसान नहीं होता है, यह सिर्फ इतना है कि दिया गया औचित्य थोड़ा गलत है।
०६ पर jw013

@ jw013 धन्यवाद
Prvt_Yadav

11

आपकी आज्ञा,

find . -maxdepth 1 -type f | ??????????_a1ac*.jpg |xargs mv -t "/home/ubuntu/ntest"

सभी फ़ाइलों की सूची पाइप सभी फ़ाइलों के लिए!

find . -maxdepth 1 -type f -name `*_a1ac*.jpg` -print0 |\
xargs  -0 -r mv -t "/home/ubuntu/ntest"

चाल चलेगा।


1
बहुत धन्यवाद ... आपके समाधान ने भी काम किया ... मुझे यह बताने के लिए धन्यवाद कि मैं कहां गलत हुआ
Apricot

8

तुम बहुत करीब हो। आपको -nameविकल्प का उपयोग करना चाहिए find। और पैटर्न को कोट करना याद रखें।

इसलिए

find . -maxdepth 1 -type f -name '??????????_a1ac*.jpg' |xargs mv -t "/home/ubuntu/ntest"

बहुत धन्यवाद ... आपके समाधान ने भी काम किया .... मुझे बताने के लिए अतिरिक्त धन्यवाद मैं समाधान के करीब था .... मेरे जैसे नौसिखिए के लिए एक प्रेरक
Apricot

1
आपको -print0अंतिम तर्क के रूप में खोजने के लिए (डिफ़ॉल्ट: -प्रिंट के बजाय) जोड़ना चाहिए, और -0पहले विकल्प के रूप में xargs (यानी :) में जोड़ना चाहिए xargs -0 mv -t "/home/ubuntu/ntest"। इस तरह, सभी प्रकार के अजीब फ़ाइलनाम (इसमें रिक्त स्थान, इसमें "न्यूलाइन", आदि के साथ) को संभाला जा सकता है। find . -maxdepth 1 -type f -name '??????????_a1ac*.jpg' -print0 |xargs -0 mv -t "/home/ubuntu/ntest" (केवल GNU जैसी खोज के साथ काम करता है)
Olivier Dulac

2

findसमाधान के रूप में "अच्छा" नहीं है , लेकिन एक और वैध समाधान है mvआदेशों को अधिक दानेदार बनाना ।

यह 4096 चाल चलता है, प्रति mvऑपरेशन कम फ़ाइलों के साथ ।

FILEPAT=a1ac
for i in $(seq $((0x000)) $((0xfff))); 
do 
   H=$(printf '%x\n' $i)
   mv 1559704165_${FILEPAT}${H}*.jpg /home/ubuntu/ntest
done

यह उन लोगों के लिए एक चतुर हैक है find( बिना किसी कारण के)।
वन

-1

यदि आप उसी होस्ट सिस्टम पर फ़ाइलों को स्थानांतरित करना चाहते हैं, जो मुझे लगता है कि आप अपने साथ कर रहे हैं mv, rsyncतो एक तेज विकल्प हो सकता है:

rsync -av --inplace -W /source/??????????_a1ac*.jpg /home/ubuntu/ntest/

--inplaceऔर -Wइस प्रक्रिया को गति देने के लिए तैयार हैं।

क्या यह एक और तर्क सूची को बहुत लंबी त्रुटि देता है तो आप सूचियों को फ़ीड कर सकते हैंrsync

उदाहरण के साथ, सूची बनाएं

find . -maxdepth 1 -type f -name '??????????_a1ac*.jpg' > /tmp/my_image_list.txt

और इसे दे दो rsync

rsync -av --inplace -W --files-from=/tmp/my_image_list.txt /path/to/files /home/ubuntu/ntest/

यहाँ स्रोत है /path/to/files, क्योंकि rsyncआपके द्वारा दी गई सूची को आप अपने स्रोत के सापेक्ष मानेंगे।


बिंदु का होना: rsyncसे तेज है mv, अगर फाइलें एक ही फाइल सिस्टम पर नहीं हैं


यह उसी "तर्क सूची को बहुत लंबे समय तक हिट करने की संभावना है" ओपी ने उल्लेख किया है कि त्रुटि
ग्रंप

@Grump, इससे बचने के लिए, ओपी किसी फाइल में कॉपी करने के लिए फाइलों की सूची लिख सकता है, यानी find . -maxdepth 1 -type f -name '??????????_a1ac*.jpg' > /tmp/my_image_list.txtफिर इसे rsync के साथ पास कर सकता है --files-from=/tmp/my_image_list.txt। जो बिंदु है rsyncवह तेज है। जब तक फाइलें एक ही फाइल सिस्टम पर नहीं रहती हैं, जो ओपी ने संकेत नहीं दिया है।
रॉबर्ट रिडेल

@RobertRiedl: आपको अपना उत्तर संपादित करना चाहिए और इस जानकारी को जोड़ना चाहिए। टिप्पणियां असंगत हो सकती हैं।
NickD

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