सवाल एकाधिक निर्देशिकाओं में स्थित फ़ाइलों की एक सूची बनाएँ


मेरे पास डेटा फाइलों का एक सेट है (*.all) विभिन्न फ़ोल्डर्स में स्थित है

Documents/rawdata/Geob1005/1.all, 2.all, 3.all,...,n.all
Documents/rawdata/Geob1006/A.all, B.all, C.all,...,Z.all          and so on...

मैंने एक फाइल बनाई है जिसे मैंने बनाया है datalist.mb-1 प्रत्येक निर्देशिका में जो सभी सूचीबद्ध करता है *.all एक ही निर्देशिका में स्थित फाइलें:

/bin/ls -1 *.all | awk '{print $1" 58"}' >datalist.mb-1

तो मुझे यह मिलता है:

Documents/rawdata/Geob1005/datalist.mb-1
Documents/rawdata/Geob1006/datalist.mb-1
and so on...

अब मुझे एक "मास्टर" डाटलिस्ट बनाने की जरूरत है Documents/rawdata/ जो निर्देशिकाओं के अंदर अन्य सभी datalists को इंगित करता है rawdata/

मुझे इस तरह दिखने के लिए "मास्टर" डातालिस्ट के नतीजे की आवश्यकता है:

Geob1005/datalist.mb-1  -­1 
Geob1006/datalist.mb-1  -1  

इस कार्य को कैसे करना है इसका कोई विचार?

अग्रिम में धन्यवाद।


4
2017-08-08 18:11


मूल


अच्छा कौशल क्या इसे बाश में होना चाहिए, या पाइथन करना होगा? ओह, क्या आप कोडिंग स्वरूपण में अपना फ़ाइल पथ और कोड डाल सकते हैं (इन `` का उपयोग करें)? - don.joey
क्या है -1 के अंत में Geob1005/datalist.mb-1 -­1 के लिए, या 58? - Symin
@Private 58 है क्योंकि मुझे datalist.mb-1 फ़ाइलों में एक कॉलम जोड़ने की आवश्यकता है जो डेटा के प्रारूप का वर्णन करता है (जो इस मामले में 58 है) - napogeof
@ Gey1005 / datalist.mb-1 -1 'के अंत में @ साइमिन -1 -1 उस पथ में स्थित डेटलिस्ट के प्रारूप का वर्णन भी करना है। मैं bathymetry डेटा प्रोसेसिंग के लिए Howto एमबी_System ट्यूटोरियल का पालन करने की कोशिश कर रहा हूँ। ldeo.columbia.edu/res/pi/MB-System - napogeof


जवाब:


अंततः मैं इसे ढूंढने में कामयाब रहा, वास्तव में मुझे पूर्ण पथ की आवश्यकता नहीं थी, लेकिन अजीब का उपयोग केवल "भौगोलिक" उपनिर्देशिका से पथ दिखाने के लिए पर्याप्त था।

मैंने इस तरह से इसे किया:

locate ~/Documents/rawdata/*/datalist.mb-1 | awk 'BEGIN {FS="/"} {print $4 "/" $5 " -1"}' > master.txt


2
2017-08-09 19:10





ऐसा करने का एक बहुत ही आसान तरीका उपयोग करना होगा locate ऐसा आदेश:

locate Documents/rawdata/Geob*/datalist.mb-1 > master.txt

यही है अगर पूर्ण पथ ठीक हैं।

हालांकि, अगर आपको केवल "भौगोलिक" उपनिर्देशिका और फ़ाइल के साथ वर्णित प्रारूप की आवश्यकता है, तो आप इस तरह की एक साधारण छोटी पायथन लिपि का उपयोग कर सकते हैं:

#!/bin/python
f = open("/path/to/master.txt","r+")
paths = [x.split("/",3)[-1] + " -1" for x in f.readlines()]
f.seek(0)
f.write("".join(paths))
f.truncate()
f.close()

नैपोगोफ के जवाब का थोड़ा छोटा संस्करण:

locate ~/Documents/rawdata/*/datalist.mb-1 | awk -F/ '{print $4 "/" $5 " -1"}' > master.txt


2
2017-08-09 01:05



मैं अंत में इसका उपयोग करने में कामयाब रहा पता लगाएँ, वास्तव में मुझे पूरा पथ की आवश्यकता नहीं थी लेकिन उपयोग कर रहा था awk "भौगोलिक" उपनिर्देशिका से पथ दिखाने के लिए पर्याप्त था। इस तरह मैंने यह किया: दोस्तों ने आखिरकार लोकेट कमांड का उपयोग करके काम करने में कामयाब रहे locate ~/Documents/rawdata/*/datalist.mb-1 | awk 'BEGIN {FS="/"} {print $4 "/" $5 " -1"}' > master.txt - napogeof
आपको इसे एक उत्तर के रूप में पोस्ट करना चाहिए। मुझे यकीन है कि बहुत से लोगों को यह उपयोगी लगेगा। - Bryan


untested

आप एकल में सभी फ़ाइलों की सूची बनाने के लिए बैश का उपयोग कर सकते हैं .txt फ़ाइल (बस एक का उपयोग करें find 'datalist' फ़ाइलों को खोजने के लिए आदेश और फिर फ़ाइल को पाइप करें)।

पायथन में आप उस फ़ाइल सूची का उपयोग कर सकते हैं (उदाहरण के लिए, datalist_master.txt) निम्नलिखित नुसार:

fi = file.open('datalist_master.txt', 'r')
li = fi.readlines()
new_li = []    

for element in li:
    # get rid of unnecessary path info
    element = element.lstrip('Documents/rawdata/')

    # add last two digits 
    element = element + ' ' + element[-2:]
    new_li.append(element)

fi.close()
print new_li #or save it somewhere

यह निश्चित रूप से बैश में भी संभव है (लेकिन मुझे नहीं पता कि कैसे)।


0
2017-08-08 18:22