लिनक्स (एमवी या सीपी) फ़ाइलों की एक पाठ सूची से विशिष्ट फाइलें?


34

मेरे पास कई फ़ाइलों की एक निर्देशिका है, जैसे कि 50,000 पीडीएफ और सर्वर पर अन्य फाइलें। मुझे विशिष्ट लोगों को किसी अन्य निर्देशिका में ले जाने की आवश्यकता है। मैं उन फ़ाइलों की एक सूची तैयार कर सकता हूं, जिन्हें सीएसवी या किसी अन्य पाठ प्रारूप में स्थानांतरित करने की आवश्यकता है।

मुझे क्या करने की आवश्यकता है एक bash स्क्रिप्ट चलाने के लिए और उन फ़ाइलों को स्थानांतरित या कॉपी करें जो पाठ फ़ाइल में किसी अन्य निर्देशिका में सूचीबद्ध हैं।

क्या ऐसा करने का एक आसान तरीका है? किसी भी सुझाव या संसाधनों की बहुत सराहना की जाएगी।


इसके अलावा, फ़ाइलों को बेतरतीब ढंग से नामित किया जाता है जब उन्हें निर्देशिका में जोड़ा जाता है। कोई नामकरण सम्मेलन या कोई तर्क नहीं है जिसका उपयोग विशिष्ट फ़ाइलों को स्थानांतरित करने के लिए किया जा सकता है।
जेस्टेप

जवाबों:


26

rsync कई विकल्प है कि इस प्रक्रिया (करने के लिए फ़ाइलों की एक सूची ले सकते हैं --files-from, --include-from, आदि)।

उदाहरण के लिए, यह चाल करेगा:

rsync -a /source/directory --files-from=/full/path/to/listfile /destination/directory

2
उदाहरण:rsync -a /source/directory --files-from=/full/path/to/listfile /destination/directory
एनाब

28

cat(और यदि आप उपयोग नहीं करते हैं rsync) के एक बेकार उपयोग से बचने के लिए :

xargs -a file_list.txt mv -t /path/to/dest

यह किसी भी मान्य फ़ाइल नाम को संभाल लेगा, जब तक कि इसमें एक नई रेखा न हो, यदि फ़ाइलों को प्रति पंक्ति एक सूचीबद्ध किया जाता है।


2
इस दृष्टिकोण का एक नुकसान यह है कि यदि सूची में मौजूद फ़ाइलों में पथ के नाम हैं (अर्थात वे सभी एक ही निर्देशिका में नहीं हैं), तो mvउन सभी का उपयोग एक ही गंतव्य निर्देशिका में हो जाएगा। rsyncस्वीकार किए जाते हैं जवाब में दृष्टिकोण इस सीमा से ग्रस्त नहीं है।
जेसन आर

इसके अलावा, मैंने इस आदेश की कोशिश की और xargs किसी भी फाइल पर टूट जाएगा जिसमें एक एकल उद्धरण ("बेजोड़ एकल उद्धरण")
जेम्स बेनिंजर

यह मेरे लिए काम करता है क्योंकि मैं वास्तव में एक ही लक्ष्य निर्देशिका में विभिन्न स्रोत पथों से फाइलें चाहता था।
छद्म नोइस

15
for file in `cat listoffiles`; do mv "$file" /path/of/destination ; done

मान लेना, प्लस listoffilesप्रति लाइन एक फ़ाइल युक्त। Rsync रूट पर मेरी एकमात्र आपत्ति यह है कि ओपी फाइलों को स्थानांतरित करने का एक तरीका पूछता है, उन्हें कॉपी नहीं करता है। rsync में शाही शादी की तुलना में अधिक झंडे हैं, इसलिए मुझे यकीन है कि ऐसा करने के लिए इसे और संशोधित किया जा सकता है, लेकिन कभी-कभी सरलता बेहतर होती है!


1
यह समाधान मुझे सबसे अधिक लचीले बनाता है। मैंने इसे cp या mv के बजाय rsync के साथ उपयोग करना समाप्त कर दिया, क्योंकि मुझे सापेक्ष फ़ाइल पथ विकल्प की आवश्यकता थी।
Spamwich

4
अच्छा, बस मुझे रिक्त स्थान की समस्या थी, इसलिए मैंने इसे संशोधित कर दिया:while read -r file; do mv "$file" /path/of/destination ; done < listoffiles
user1182474

1
@ user1182474 धन्यवाद, और इनपुट पुनर्निर्देशन का एक सुरुचिपूर्ण उपयोग। एक उत्तर के साथ संतुष्टि दिखाने की पारंपरिक विधि को उभारना है, वैसे!
MadHatter

1
@ user1182474 इसके लिए धन्यवाद! कई संशोधनों में अंतिम चरण कुछ हद तक आँख बंद करके अपने Android के लिए मेरे OSX बैकअप उपयोगिताओं को पोर्ट करना था!
चार्ली गोरीचनज

4

यह आपके पास मौजूद टेक्स्ट फ़ाइल के प्रारूप पर निर्भर करता है। उदाहरण के लिए, यदि आपके पास ऐसी फ़ाइलों की सूची है, जैसे कि प्रत्येक फ़ाइल एक नई लाइन पर स्थित है। आप xargs का उपयोग कर सकते हैं जैसे:

$ cat your_text_file | xargs cp -t /path/to/destination

इसके अलावा, आप विकल्प के findसाथ कमांड का उपयोग कर सकते हैं -exec। फ़ाइलों को कॉपी / स्थानांतरित करने के लिए।


3
rsync --files-from=file_list.txt /path/to/source/ /path/to/dest/

रुपीक्स में cpया mvकमांड्स पर अतिरिक्त लाभ होता है क्योंकि यदि वे मौजूद नहीं हैं तो यह स्वचालित रूप से फ़ोल्डर्स बनाएगा।


/path/to/sourceफ़ाइल सूची से पथ लेने पर इसकी आवश्यकता क्यों है ?
बेजरो

@bzero शायद फ़ाइलों की सूची में रिश्तेदार पथ हो सकते हैं?
DreadfulWeather

2

मुझे लगता है कि rsync उत्तर एक बेहतर है, लेकिन सिर्फ एक अन्य विकल्प के लिए:

tar -cf - -T FILE_OF_FILENAMES_TO_MOVE.txt |(cd /path/to/new/dir && tar -xvf -)

यह डॉकरफाइल के लिए अच्छा है, क्योंकि टार ubuntu बेस इमेज में उपलब्ध है, लेकिन rsync नहीं।
kristianp

1

मैंने गलती से पूरी निर्देशिका को स्थानांतरित करने के बजाय एक निर्देशिका की पूरी सामग्री को गंतव्य निर्देशिका में कॉपी कर लिया। इसके परिणामस्वरूप मूल निर्देशिका के बजाय अव्यवस्थित गंतव्य निर्देशिका को निर्देशिका में जोड़ा जा रहा है।

इसे ठीक करने के लिए, मैंने निम्नलिखित कार्य किया:

ls -rt /path/to/cluttered/destination/directory/ > /opt/dircheck/filestomove उपरोक्त कमांड फाइलस्टोमोव फाइल बनाता है जो गंतव्य निर्देशिका की सभी सामग्रियों की सूची होगी, जो समय के अनुसार क्रमबद्ध होती है, जिसका अर्थ सबसे पुराना सबसे नया है।

फिर मैंने सामान को स्थानांतरित करने के लिए अब क्लुट किए गए गंतव्य निर्देशिका की उप-निर्देशिका बनाई।

mkdir /path/to/cluttered/destination/directory/newsubdirectory

फिर मैंने निर्देशिका लिस्टिंग को दोहराया, स्क्रीन को सूचीबद्ध करने और अधिक विवरण दिखाने के अलावा।

ls -lrht /path/to/cluttered/destination/directory/ यह रेखा उस निर्देशिका को सूचीबद्ध करती है, जो दिनांक आरोही (समय के अनुसार क्रमबद्ध) के आधार पर क्रमबद्ध होती है और अधिक जानकारी दिखाती है, जिसमें अब क्लैट किए गए गंतव्य निर्देशिका में प्रत्येक फ़ाइल की तिथि / समय स्टाम्प भी शामिल है। मैं इसका उल्लेख करता हूं, शीर्ष पर शुरू करके यह दिखाने के लिए कि मैं क्या निर्देशिका और फाइलें रखना चाहता हूं, जहां वे थे। फ़ाइलों की दिनांक / समय स्टैम्प में एक गैप होगा जहाँ सभी नई फाइलें शुरू होती हैं जो वहाँ नहीं होनी चाहिए।

फिर मैंने ऊपर के पहले चरण में बनाई गई फाइलस्टोमोव फ़ाइल को संपादित किया (जो कि तिथि के अनुसार क्रमबद्ध है) और कुछ को उस सूची से हटा दिया जो पहले थी कि मैं मूल निर्देशिका से रहना चाहता हूं।

vim /opt/dircheck/filestomove ऊपर से हटाएं, वे सभी फाइलें जिन्हें आप स्थानांतरित नहीं करना चाहते हैं।

फिर मैंने अपनी सूची में फ़ाइलों को अपनी नई निर्देशिका में स्थानांतरित करने के लिए इस पोस्ट में पहले से सूचीबद्ध कमांड का उपयोग किया।

sudo xargs -a /opt/dircheck/filestomove mv -t /path/to/cluttered/destination/directory/newsubdirectory

यह एक विभाजन सेकंड में सभी फाइलों को स्थानांतरित कर दिया। (नोट: आपको शुरुआत में sudo की आवश्यकता नहीं हो सकती है, यह फ़ाइल अनुमतियों का मामला है)।

अब मेरी मूल गंतव्य निर्देशिका अच्छी और साफ है और इसमें सभी फाइलों और निर्देशिकाओं के साथ एक नई निर्देशिका शामिल है जो इसे अव्यवस्थित कर रहे थे।


1

यदि (और केवल यदि), तो आपके पास फ़ाइल नाम (रिक्त स्थान, newlines, जो व्यक्तिगत तर्क में चीजों को तोड़ने के तरीके पर xargs को भ्रमित नहीं करेगा) में कोई बुरा चरित्र नहीं है, और आप newlines द्वारा अलग की गई फ़ाइलों की एक सूची उत्पन्न करते हैं (एक फ़ाइल प्रति पंक्ति), आप कुछ ऐसा कर सकते हैं।

cat filenames.txt | xargs mv -t /path/to/move/files/to

(सामान्य तौर पर, आदमी xargs देखें , यह कमाल है)

यदि आपके विशेष mv के पास -t विकल्प नहीं है, तो आप कुछ चालबाजी भी कर सकते हैं

( cat filenames.txt; echo; echo /path/to/move/files/to ) | xargs mv

नोट - इनमें से कोई भी उम्मीद के मुताबिक काम नहीं करेगा यदि उनमें नई कहानियों के साथ फिल्माया गया नाम हो।


तथापि; इग्नासियो का उत्तर देखें, rsync इस सामान के लिए बनाया गया है।
Kjetil Joergensen

cp, mvऔर जैसे bsd के-t विकल्प पर विकल्प नहीं है , और /path/to/move

1
@ w17t - filenames.txt की तरह लगता है कि एक newline के साथ समाप्त नहीं होता है, या तो filenames.txt के अंत में newline जोड़ें, या कुछ ऐसा करें(cat filenames.txt; echo; echo /path/to/move/files/to) | xargs mv
Kjetil Joergensen

0

कुछ इस तरह का प्रयास करें:

cat list.txt | while read line; do mv "$line" /images; done

while read line; do mv $line /images; done < list.txt एक ही आदेश के रूप में किया जा सकता था
प्रज्वलित

0

निम्नलिखित ने मेरे लिए काम किया जहां मुझे निर्देशिका संरचना को संरक्षित करते हुए सभी पीएनजी फाइलों को एक विशिष्ट पथ (और सभी उपखंड) से एक नए स्थान पर कॉपी करने की आवश्यकता थी:

rsync -av --prune-empty-dirs --include='*/' --include='*.png' --exclude='*' source/ destination/

क्योंकि RSYNC पहले डायरेक्टरी स्ट्रक्चर का मिरर बनाता है, फिर फ़ाइलों को सिंक करता है, आप अतिरिक्त फोल्डर को खाली कर सकते हैं। मैंने इन खाली निर्देशिकाओं को निकालने के लिए --prune-blank-dirs ध्वज का उपयोग किया।

मेरा कोई जुड़ाव नहीं है, लेकिन इस समाधान को प्रेरित करने वाले स्रोत को श्रेय देना सही समझा: http://techblog.zabuchy.net/2011/transfer-only-selected-file-types-with-rsync/

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