In einem Linux-System habe ich eine Reihe sehr großer Dateien, die eine lange Liste von Einträgen enthalten, eine pro Zeile, die einzeln gelesen werden, um bestimmte Indexdateien für jede von ihnen zu erstellen, die später für einen anderen Prozess verwendet werden . Zum Beispiel:
indexprogram file1.txt
# creates file1.txt.idxA file1.txt.idxB file.txt.idxC file.txt.idxD
analysisprogram file1.txt
# reads file1.txt as well as the index files and produces some output
Ich möchte die Dateien, die ich habe, kombinieren, indem ich etwas Äquivalentes zu einem Symlink aus verketteten Dateien erstelle, damit ich die Dateien wiederverwenden und etwas Platz sparen und nur die Indexdateien aus der kombinierten Eingabe erstellen kann. Zum Beispiel:
create symlink of "cat file1.txt file2.txt file3.txt > file1.2.3.txt"
indexprogram file1.2.3.txt
# creates file1.2.3.txt.idxA file1.2.3.txt.idxB file1.2.3.txt.idxC file1.2.3.txt.idxD
analysisprogram file1.2.3.txt
# reads file1.2.3.txt as if it were a real file, reads index files, produces output
Gibt es eine Möglichkeit, diese symbolische Verkettung von Dateien zu erstellen? Vielleicht mit Named Pipes oder ähnlichen Tricks?
Antworten:
Nein, ich glaube nicht, dass das möglich ist.
Eine Datei ist eine Sammlung von Bytes auf einer Festplatte, die durch eine eindeutige ID und einige Metadaten, einschließlich Dateiname usw., gekennzeichnet sind. Ein Symlink verweist auf die eindeutige ID einer anderen Datei. Ich kenne keine Implementierung, bei der ein Link auf mehrere Ziele verweist.
Zu diesem Zweck möchten Sie möglicherweise eine Datenbank verwenden, z. B. SQLite oder ähnliches.
Siehe auch dieses verwandte Thema https://stackoverflow.com/questions/423320/can-i-symlink-multiple-directories-into-one
quelle
Versuchen Sie dies (ungetestet)
Es ist wahrscheinlich sauberer, auf Indexprogramm und Analyseprogramm zu aktualisieren, um von stdin zu lesen, wenn in der Befehlszeile keine Dateinamen angegeben sind.
Rückblickend würde ich jetzt eine Prozessersetzung in bash / ksh / zsh verwenden:
Dies gibt das Argument * program 1 in der Befehlszeile an: einen Dateinamen, aus dem die Zeilen gelesen werden können.
quelle