Frage Erstellen Sie eine Liste von Dateien in mehreren Verzeichnissen


Ich habe eine Reihe von Dateien (*.all) befindet sich in verschiedenen Ordnern

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

Ich habe eine Datei namens erstellt datalist.mb-1 in jedem Verzeichnis, das alle auflistet *.all Dateien im selben Verzeichnis mit:

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

also bekomme ich das:

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

Jetzt muss ich einen "Master" -Datenlistener erstellen Documents/rawdata/ das weist auf alle anderen Datenlisten innerhalb der Verzeichnisse von rawdata/

Ich brauche das Ergebnis des "Master" -Datenschreibers, um so auszusehen:

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

Irgendeine Idee, wie man diese Aufgabe durchführt?

Danke im Voraus.


4
2017-08-08 18:11


Ursprung


Nette Fähigkeiten. Muss es in bash sein, oder wird Python tun? Oh, können Sie Ihre Dateipfade und Code in Codierung formatieren (verwenden Sie diese ``)? - don.joey
was ist der -1 am Ende von Geob1005/datalist.mb-1 -­1 für, oder die 58? - Symin
@Private Die 58 ist, weil ich eine Spalte zu den Dateien datalist.mb-1 hinzufügen muss, die das Format der Daten beschreibt (die in diesem Fall 58 ist) - napogeof
@Symin Die -1 am Ende von 'Geob1005 / datalist.mb-1 -1' soll auch das Format des Datenträgers beschreiben, der sich in diesem Pfad befindet. Ich versuche, ein HowTo MB_System Tutorial für Bathymetrie Datenverarbeitung zu folgen. ldeo.columbia.edu/res/pi/MB-System - napogeof


Antworten:


Ich schaffte es schließlich, es mit Locate zu machen, tatsächlich brauchte ich nicht den vollständigen Pfad, aber mit awk konnte ich nur den Pfad aus dem "geo" -Unterverzeichnis anzeigen.

So habe ich es gemacht:

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


2
2017-08-09 19:10





Ein wirklich einfacher Weg, dies zu tun, wäre die Verwendung der locate Befehl wie folgt:

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

Das heißt, wenn volle Pfade in Ordnung sind.

Wenn Sie jedoch das oben beschriebene Format nur mit dem Unterverzeichnis "geo" und der Datei benötigen, können Sie ein einfaches kleines Python-Skript wie dieses verwenden:

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

Leicht abgeschnittene Version von Napogeofs Antwort:

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


2
2017-08-09 01:05



Ich habe es endlich geschafft, es zu benutzen Lokalisieren, eigentlich brauchte ich nicht den vollen Pfad sondern benutze awk Genug, um nur den Pfad vom Unterverzeichnis "geo" anzuzeigen. So habe ich es gemacht: Jungs, ich habe es schließlich geschafft, die Aufgabe mit dem Locate-Befehl zu erledigen locate ~/Documents/rawdata/*/datalist.mb-1 | awk 'BEGIN {FS="/"} {print $4 "/" $5 " -1"}' > master.txt - napogeof
Sie sollten das als Antwort posten. Ich bin sicher, dass viele Leute es nützlich finden würden. - Bryan


Ungetestet

Sie könnten bash verwenden, um eine Liste aller Dateien in einer einzigen Datei zu erstellen .txt Datei (benutze einfach eine find Befehl, um die 'datalist' Dateien zu finden und dann die Datei zu pipen).

In Python können Sie diese Dateiliste verwenden (z. B. datalist_master.txt) wie folgt:

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

Dies ist sicherlich auch in bash möglich (aber ich weiß nicht wie).


0
2017-08-08 18:22