|
发表于 2007-3-5 23:32:44
|
显示全部楼层
lz对管道的理解有误。
请看这个例子:
ls
tmp.rar
xxx@yyy ~/temp$ unrar e * | more
UNRAR 3.51 freeware Copyright (c) 1993-2005 Alexander Roshal
Extracting from tmp.rar
Extracting 1.txt OK
Extracting 2.txt OK
Extracting 3.txt OK
All OK
可以看到unrar送入管道的输出决非lz所想象的那样,是简单的文件名(这个例子里是1.txt 2.txt 3.txt)。另外,即便unrar输出的乃是文件名,tar似乎仍然不接受这种依靠管道送入的参数:
xxx@yyy:~/temp$ ls
1.txt 2.txt 3.txt
xxx@yyy:~/temp$ tar cvzf tmp.tar.gz
tar: 谨慎地拒绝创建空归档文件
用“tar --help”或“tar --usage”获取更多信息。
xxx@yyy:~/temp$ ls
1.txt 2.txt 3.txt
xxx@yyy:~/temp$ ls | tar cvzf tmp.tar.gz
tar: 谨慎地拒绝创建空归档文件
用“tar --help”或“tar --usage”获取更多信息。
个人怀疑这应该是tar这个程序的设计原因。
即便tar接受管道过来的参数,楼主对管道的用法也有问题:
xxx@yyy:~/temp$ ls
tmp.rar
xxx@yyy:~/temp$ unrar e tmp.rar | tar cvzf h.tar.gz *
tmp.rar
xxx@yyy:~/temp$ ls
1.txt 2.txt 3.txt h.tar.gz tmp.rar
xxx@yyy:~/temp$ tar tvf *gz
-rw-r--r-- xxx/xxx 186 2007-03-05 23:15 tmp.rar
让我们假设unrar将解压出来的文件名送入管道,而tar可以从管道接受参数,那么,也应该这样写:
unrar e tmp.rar | tar cvzf filename.tar.gz
而不应该再加那个*了。具体可以去看看bash对*的解释等等文章。
个人对这个case的一个解决方法:
建立一个目录,将目标rar文件解压入该新目录。
然后用tar处理这个目录内文件,生成tar.gz
rm -rf那个目录。 |
|