Symlink von verketteten Dateien?

1

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?

719016
quelle
Vielleicht mit Named Pipes oder einem ähnlichen Trick?
719016

Antworten:

2

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

Tim
quelle
4

Versuchen Sie dies (ungetestet)

mkfifo file1.2.3.txt
cat file1.txt file2.txt file3.txt > file1.2.3.txt
indexprogram file1.2.3.txt
cat file1.txt file2.txt file3.txt > file1.2.3.txt
analysisprogram file1.2.3.txt

Es ist wahrscheinlich sauberer, auf Indexprogramm und Analyseprogramm zu aktualisieren, um von stdin zu lesen, wenn in der Befehlszeile keine Dateinamen angegeben sind.

cat file1.txt file2.txt file3.txt | indexprogram 
cat file1.txt file2.txt file3.txt | analysisprogram

Rückblickend würde ich jetzt eine Prozessersetzung in bash / ksh / zsh verwenden:

files=( file1.txt file2.txt file3.txt )

indexprogram    <( cat "${files[@]}" )
analysisprogram <( cat "${files[@]}" )

Dies gibt das Argument * program 1 in der Befehlszeile an: einen Dateinamen, aus dem die Zeilen gelesen werden können.

Glenn Jackman
quelle