将tar.gz文件中包含的文件管道文件转换为bash中的c ++程序

时间:2016-04-16 09:08:11

标签: linux bash pipe

我有一个可以按以下格式运行的C ++程序(两种情况):

./main 10000 file1.txt

OR

./main 10000 file1.txt file2.txt

其中file1.txtfile2.txt是大文本文件。我有file.tar.gz基本上可能包括:

  1. 只有一个文件(file1.txt
  2. 两个文件file1.txtfile2.txt
  3. 在两种情况下,即使gz文件包含一个或两个文件,bash中是否有一种方法可以使用管道直接从gz文件中读取文件?我已经在Pipe multiple files (gz) into C program检查了但是我对bash不太了解,因此我很难理解那里的答案。

1 个答案:

答案 0 :(得分:3)

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

  1. 确定存档是否包含一个或两个文件
  2. 为每个文件设置命名管道(fifos)(“mkfifo”命令)
  3. 运行命令以将存档中文件的内容输出到相应的fifo,作为后台进程
  4. 运行primary命令,将fifos指定为文件名参数
  5. 我认为,给出所有这一切的完整概要超出了Stackoverflow问题的范围。对于(1),你可以做类似的事情:

    FILECOUNT=`tar -vzf (filename.tar.gz) | wc -l`
    

    这将列出归档中的文件(tar -vzf)并计算该命令(wc -l)的输出行数。它不是万无一失的,但如果文件名是简单的名称(如你建议的那样)(file1.txt,file2.txt),它应该可以工作。

    对于(2),根据需要制作一个或两个十五个:

    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)只是:

    SECONDFILE=""
    if [ $FILECOUNT = 2 ]; then
        SECONDFILE=file2-fifo.txt
    fi
     ./main 1000 file1-fifo.txt $SECONDFILE
    

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

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

    请注意,这将涉及为每个文件一次提取存档内容两次(并行)。我无法(我能想到)解决这个问题。