我使用ls获取具有空格的文件名,因此它看起来像:
my file with whitespace.tar.bz2
我想把它传递给tar,类似于:
ls | grep mysearchstring | tar xvjf
如何在将它引用到tar之前插入双引号?
答案 0 :(得分:7)
一个很好的工具是find和xargs。例如,您可以使用:
find . -name '*.tar.bz2' -print0 | xargs -0 -n1 tar xjf
正如pixelbeat建议你也可以像这样使用shell:
for archive in *.tar.bz2; do tar xvjf "$archive"; done
答案 1 :(得分:0)
shell-wildcard扩展有什么问题? (假设只有一个文件名。)
% tar -cvf *mysearchstring*
% tar -xvf *mysearchstring*
当然,匹配* mysearchstring *的文件名将包含空格。但shell [tcsh,bash]会将该文件名包括其空格分配给tar的单个参数。
您可以使用简单的C或C ++程序验证这一点。 E.g:
#include <iostream>
using namespace std;
int main( int argc, char **argv )
{
cout << "argc = " << argc << endl;
for ( int i = 0; i < argc; i ++ )
cout << "argv[" << i << "] = \"" << argv[i] << "\"" << endl;
return 0;
}
尝试: ./ a.out * foo *
这就是为什么CSH有:q [引用的词表]选项......
E.g。 [tcsh的]
foreach FILE ( *mysearchstring* )
tar -xvf $FILE:q
end
或 tar -xvf“$ FILE”而不是 tar -xvf $ FILE:q ,如果您愿意的话。
如果你真的必须使用 ls ...
使用 ls 管道传输任何内容都会输出一行文件名。使用 tr ,我们可以将换行符转换为任何其他字符,例如null。 xargs 可以接收以空字符结尾的字符串。这避免了空间问题。使用 -n1 将克服多个文件问题。
例如:\ ls | grep mysearchstring | tr'\ 012''\ 0'| xargs --null -n1 tar -xvf
但我不相信 tar 可以容纳来自stdin的多个tarfiles,就像OP拥有它一样......