سؤال إنشاء قائمة من الملفات الموجودة في دلائل متعددة


لدي مجموعة من ملفات البيانات (*.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...

الآن أنا بحاجة إلى إنشاء datalist "الرئيسية" في Documents/rawdata/ يشير إلى جميع القدريين الآخرين داخل دلائل rawdata/

أحتاج إلى نتيجة "سيد" datalist لتبدو هكذا:

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
Symin إن -1 في نهاية 'Geob1005 / datalist.mb-1 -1' هو أيضًا وصف تنسيق الدالتيست الموجود في ذلك المسار. أحاول اتباع البرنامج التعليمي لـ HowTo MB_System من أجل معالجة بيانات قياس الأعماق. ldeo.columbia.edu/res/pi/MB-System - napogeof


الأجوبة:


تمكنت أخيراً من القيام بذلك باستخدام Locate ، في الواقع لم أكن بحاجة إلى المسار الكامل ولكن استخدام awk كان كافيًا لإظهار المسار من الدليل الفرعي "الجغرافي" فقط.

هكذا فعلت ذلك:

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

هذا إذا كانت المسارات الكاملة على ما يرام.

ومع ذلك ، إذا كنت بحاجة إلى التنسيق الذي وصفته أعلاه مع الدليل الفرعي "الجغرافي" والملف فقط ، فيمكنك استخدام نص بسيط صغير من نوع python مثل هذا:

#!/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()

نسخة مبتورة قليلاً من إجابة napogeof:

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


2
2017-08-09 01:05



تمكنت أخيرا من القيام بذلك باستخدام حدد، في الواقع لم أكن بحاجة إلى المسار الكامل ولكن باستخدام AWK كان يكفي لإظهار المسار من الدليل الفرعي "الجغرافي". هذه هي الطريقة التي قمت بها: اللاعبين تمكنت في النهاية من القيام بالمهمة باستخدام الأمر Locate locate ~/Documents/rawdata/*/datalist.mb-1 | awk 'BEGIN {FS="/"} {print $4 "/" $5 " -1"}' > master.txt - napogeof
يجب أن تنشر ذلك كإجابة. أنا متأكد من أن الكثير من الناس قد يجدونها مفيدة. - Bryan


لم تختبر

يمكنك استخدام bash لإعداد قائمة بكل الملفات في ملف واحد .txt ملف (مجرد استخدام find أمر للعثور على الملفات "datalist" ثم الأنابيب التي الملف).

في python ، يمكنك استخدام قائمة الملفات هذه (على سبيل المثال ، 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