Questão criar uma lista de arquivos localizados em vários diretórios


Eu tenho um conjunto de arquivos de dados (*.all) localizado em diferentes pastas

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

Eu criei um arquivo chamado datalist.mb-1 em cada diretório que lista todos os *.all arquivos localizados no mesmo diretório usando:

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

então eu entendo isso:

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

Agora eu preciso criar um datalist "mestre" em Documents/rawdata/ que aponta para todos os outros datalistas dentro dos diretórios de rawdata/

Eu preciso do resultado do datalista "mestre" para ficar assim:

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

Alguma idéia de como fazer essa tarefa?

Desde já, obrigado.


4
2017-08-08 18:11


origem


Boas habilidades. Tem que estar no bash, ou será o python? Você pode colocar seus caminhos de arquivo e código em formatação de código (use estes ``)? - don.joey
o que é -1 no fim de Geob1005/datalist.mb-1 -­1 para ou o 58? - Symin
@Private O 58 é porque eu preciso adicionar uma coluna aos arquivos datalist.mb-1, que descreve o formato dos dados (que neste caso é 58) - napogeof
@Symin O -1 no final de 'Geob1005 / datalist.mb-1 -1' também descreve o formato do datalist localizado nesse caminho. Eu estou tentando seguir um tutorial HowTo MB_System para processamento de dados de batimetria. ldeo.columbia.edu/res/pi/MB-System - napogeof


Respostas:


Eu finalmente consegui fazer isso usando Locate, na verdade eu não precisei do caminho completo, mas usar o awk foi o suficiente para mostrar apenas o caminho do subdiretório "geo".

Foi assim que eu fiz:

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


2
2017-08-09 19:10





Uma maneira muito simples de fazer isso seria usar o locate comando assim:

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

Isto é, se os caminhos completos estiverem bem.

No entanto, se você precisar do formato que você descreveu acima apenas com o subdiretório e arquivo "geo", você pode usar um pequeno script python simples como este:

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

Versão ligeiramente truncada da resposta de napogeof:

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


2
2017-08-09 01:05



Eu finalmente consegui fazer isso usando Localizar, na verdade eu não precisava do caminho completo, mas usando awk foi o suficiente para mostrar apenas o caminho do subdiretório "geo". Foi assim que eu fiz: Pessoal, finalmente consegui fazer a tarefa usando o comando Locate locate ~/Documents/rawdata/*/datalist.mb-1 | awk 'BEGIN {FS="/"} {print $4 "/" $5 " -1"}' > master.txt - napogeof
Você deve postar isso como uma resposta. Tenho certeza que muita gente acharia útil. - Bryan


Não testado

Você poderia usar bash para fazer uma lista de todos os arquivos em um único .txt arquivo (basta usar um find comando para localizar os arquivos 'datalist' e depois canalizar o arquivo).

Em python você pode usar essa lista de arquivos (por exemplo, datalist_master.txt) do seguinte modo:

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

Isto é certamente também possível no bash (mas eu não sei como).


0
2017-08-08 18:22