Linux 将tar.gz文件中包含的文件导入到c++;bash中的程序 我有一个C++程序,可以按照以下格式运行(两种情况):

Linux 将tar.gz文件中包含的文件导入到c++;bash中的程序 我有一个C++程序,可以按照以下格式运行(两种情况):,linux,bash,pipe,Linux,Bash,Pipe,或 其中file1.txt和file2.txt是巨大的文本文件。我有文件.tar.gz,基本上可能包括: 只有一个文件(file1.txt) 两个文件file1.txt和file2.txt 在bash中有没有一种方法可以使用pipe直接从gz文件中读取这两种情况下的文件,即即使gz文件包含一个或两个文件?我查过了,但是我对bash不是很了解,因此,我很难理解那里的答案 这不会特别简单。你的问题实在太宽泛了。一种办法是: 确定归档文件包含一个还是两个文件 为每个文件设置命名管道(FIFO)(“mk

其中
file1.txt
file2.txt
是巨大的文本文件。我有
文件.tar.gz
,基本上可能包括:

  • 只有一个文件(
    file1.txt
  • 两个文件
    file1.txt
    file2.txt

  • 在bash中有没有一种方法可以使用pipe直接从gz文件中读取这两种情况下的文件,即即使gz文件包含一个或两个文件?我查过了,但是我对bash不是很了解,因此,我很难理解那里的答案

    这不会特别简单。你的问题实在太宽泛了。一种办法是:

  • 确定归档文件包含一个还是两个文件
  • 为每个文件设置命名管道(FIFO)(“mkfifo”命令)
  • 运行命令,将存档中文件的内容作为后台进程输出到相应的fifo
  • 运行主命令,将FIFO指定为文件名参数
  • 我认为,对所有这些进行全面概述超出了Stackoverflow问题的范围。对于(1),您可能可以执行以下操作:

    FILECOUNT=`tar -vzf (filename.tar.gz) | wc -l`
    
    这将列出存档中的文件(
    tar-vzf
    ),并统计该命令的输出行数(
    wc-l
    )。这不是万无一失的,但是如果文件名是像您建议的那样简单的名称(file1.txt,file2.txt),那么它应该可以工作

    对于第(2)项,根据需要制作一个或两个FIFO:

    mkfifo file1-fifo.txt
    if [ $FILECOUNT = 2 ]; then
        mkfifo file2-fifo.txt
    fi
    
    对于(3),使用
    tar
    -O
    从存档中提取文件内容,并将其重定向到fifo,作为后台处理:

    tar -O -xf (filename.tar.gz) file1.txt > file1-fifo.txt &
    if [ $FILECOUNT = 2 ]; then
        tar -O -xf (filename.tar.gz) file2.txt > file2-fifo.txt &
    fi
    
    然后(4)就是:

    最后,您应该删除fifo节点:

    rm file1-fifo.txt
    rm file2-fifo.txt
    

    请注意,这将涉及两次(并行)提取归档内容,每个文件提取一次。(我想)没有办法绕过这个问题。

    一个gz文件不能包含多个文件(除非该文件是包含其他文件的存档文件,这是一个稍微不同的问题)。@davmac它是一个tar.gz文件。因此,它还包含两个文件,信息不足。你的程序“main”实际上做什么?它会接受标准输入吗?是单独处理单独的文件还是有有效的内容连接?等等,“这是一个tar.gz”-然后你需要编辑你的问题。“它会接受通过stdin输入吗”?不,它需要从args中获取(一)两个文件名并读取文件。不,这些文件不能连接,但必须以不同的级别读取,以节省您的时间和精力。我会事先知道tar.gz是否包含一个或两个文件,因此您的解决方案可以进一步简化。这是一个出色的解决方案。我认为您不必运行两次
    tar
    来分别提取文件。如果您知道tar文件中文件的名称(可能是从您用来计算它们的
    tart
    过程中),您应该能够使用这些名称构造fifo,并有一个常规的
    tarx
    调用(没有
    -O
    )在它们之上提取。我先前评论的附录:
    tar
    有时不愿意在现有文件(在本例中为命名管道)的“之上”提取。因此,您可能需要一个特殊的选项才能使其正常工作。请看这里:
    tar -O -xf (filename.tar.gz) file1.txt > file1-fifo.txt &
    if [ $FILECOUNT = 2 ]; then
        tar -O -xf (filename.tar.gz) file2.txt > file2-fifo.txt &
    fi
    
    SECONDFILE=""
    if [ $FILECOUNT = 2 ]; then
        SECONDFILE=file2-fifo.txt
    fi
     ./main 1000 file1-fifo.txt $SECONDFILE
    
    rm file1-fifo.txt
    rm file2-fifo.txt