Câu hỏi tạo danh sách các tệp nằm trong nhiều thư mục


Tôi có một tập hợp các tệp dữ liệu (*.all) nằm trong các thư mục khác nhau

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...

Tôi đã tạo một tệp có tên datalist.mb-1 trong mỗi thư mục liệt kê tất cả *.all các tệp nằm trong cùng một thư mục sử dụng:

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

vì vậy tôi nhận được điều này:

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

Bây giờ tôi cần tạo một chuyên gia dữ liệu "chính" trong Documents/rawdata/ chỉ ra cho tất cả các nhà dữ liệu khác bên trong các thư mục của rawdata/

Tôi cần kết quả của chuyên gia dữ liệu "chính" để trông như thế này:

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

Bất kỳ ý tưởng làm thế nào để làm nhiệm vụ này?

Cảm ơn trước.


4
2017-08-08 18:11


gốc


Kỹ năng tốt. Nó có phải là bash, hoặc sẽ python làm gì? Oh, bạn có thể đặt đường dẫn tệp và mã của bạn trong định dạng mã hóa (sử dụng các ``) này không? - don.joey
cái gì vậy -1 vào cuối Geob1005/datalist.mb-1 -­1 cho, hoặc 58? - Symin
@Private 58 là vì tôi cần thêm một cột vào các tệp datalist.mb-1 mô tả định dạng dữ liệu (trong trường hợp này là 58) - napogeof
@Symin -1 ở cuối của 'Geob1005 / datalist.mb-1 -1' cũng là mô tả định dạng của datalist nằm trong đường dẫn đó. Tôi đang cố gắng làm theo một hướng dẫn HowTo MB_System để xử lý dữ liệu bathymetry. ldeo.columbia.edu/res/pi/MB-System - napogeof


Các câu trả lời:


Cuối cùng tôi đã xoay xở để thực hiện nó bằng Locate, thật ra tôi không cần đường dẫn đầy đủ nhưng sử dụng awk là đủ để chỉ hiển thị đường dẫn từ thư mục con "geo".

Đây là cách tôi đã làm nó:

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


2
2017-08-09 19:10





Một cách thực sự đơn giản để thực hiện việc này là sử dụng locate lệnh như vậy:

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

Đó là nếu đường dẫn đầy đủ không sao.

Tuy nhiên, nếu bạn cần định dạng mà bạn đã mô tả ở trên chỉ với thư mục con "địa lý" và tệp bạn có thể sử dụng một tập lệnh python nhỏ đơn giản như thế này:

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

Một phiên bản ngắn gọn của câu trả lời của napogeof:

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


2
2017-08-09 01:05



Cuối cùng tôi đã xoay xở để làm điều đó bằng cách sử dụng Định vị, thực ra tôi không cần đường dẫn đầy đủ nhưng sử dụng lúng túng đủ để chỉ hiển thị đường dẫn từ thư mục con "địa lý". đây là cách tôi đã làm nó: Guys tôi cuối cùng đã quản lý để làm nhiệm vụ bằng cách sử dụng lệnh Locate locate ~/Documents/rawdata/*/datalist.mb-1 | awk 'BEGIN {FS="/"} {print $4 "/" $5 " -1"}' > master.txt - napogeof
Bạn nên đăng bài đó như một câu trả lời. Tôi chắc rằng nhiều người sẽ thấy nó hữu ích. - Bryan


Chưa được kiểm tra

Bạn có thể sử dụng bash để tạo danh sách tất cả các tệp trong một tệp .txt tệp (chỉ cần sử dụng find lệnh để tìm tập tin 'datalist' và sau đó đặt tên cho tệp đó).

Trong python bạn có thể sử dụng danh sách tập tin đó (ví dụ, datalist_master.txt) như sau:

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

Điều này là chắc chắn nhất cũng có thể trong bash (nhưng tôi không biết làm thế nào).


0
2017-08-08 18:22