我有一个可以按以下格式运行的C ++程序(两种情况):
./main 10000 file1.txt
OR
./main 10000 file1.txt file2.txt
其中file1.txt
和file2.txt
是大文本文件。我有file.tar.gz
基本上可能包括:
file1.txt
)file1.txt
和file2.txt
在两种情况下,即使gz文件包含一个或两个文件,bash中是否有一种方法可以使用管道直接从gz文件中读取文件?我已经在Pipe multiple files (gz) into C program检查了但是我对bash不太了解,因此我很难理解那里的答案。
答案 0 :(得分:3)
这不会特别简单。你的问题实在太宽泛了。一种方法是:
我认为,给出所有这一切的完整概要超出了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
请注意,这将涉及为每个文件一次提取存档内容两次(并行)。我无法(我能想到)解决这个问题。