在 Linux 系统中,我有一组非常大的文件,其中包含一长串条目,每行一个,这些条目被逐个读取以为每个条目创建特定的索引文件,然后稍后用于另一个进程。例如:
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
我想通过创建相当于连接文件的符号链接的东西来合并我拥有的文件,以便我可以重复使用这些文件并节省一些空间,并且只从组合输入中生成索引文件。例如:
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
有没有办法创建这种文件的符号连接?也许使用命名管道或类似的技巧?
答案1
不,我认为这是不可能的。
文件是磁盘上的字节集合,由唯一 ID 和一些元数据(包括文件名等)标识。符号链接指向另一个文件的唯一 ID。我不知道一个链接指向多个目标的实现。
为此,您可能需要研究使用数据库,例如 sqlite 或类似的东西。
另请参阅此相关主题https://stackoverflow.com/questions/423320/can-i-symlink-multiple-directories-into-one
答案2
尝试一下(未经测试)
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
如果命令行中没有给出文件名,那么更新索引程序和分析程序以从标准输入读取可能会更干净。
cat file1.txt file2.txt file3.txt | indexprogram
cat file1.txt file2.txt file3.txt | analysisprogram
回顾这一点,我现在会在 bash/ksh/zsh 中使用进程替换:
files=( file1.txt file2.txt file3.txt )
indexprogram <( cat "${files[@]}" )
analysisprogram <( cat "${files[@]}" )
这会在命令行上给出 *program 1 参数:一个可以从中读取行的文件名。