I use ls to obtain my filename which has white space so it looks something like:
my file with whitespace.tar.bz2
I want to pipe this to tar similar to:
ls | grep mysearchstring | tar xvjf
How can I insert double quotes before piping it to tar?
一个很好的工具是 find 和 xargs。例如,您可以使用:
find . -name '*.tar.bz2' -print0 | xargs -0 -n1 tar xjf
正如pixelbeat建议的那样,您也可以像这样使用shell:
for archive in *.tar.bz2; do tar xvjf "$archive"; done
外壳通配符扩展有什么问题?(假设只有一个文件名。)
% tar -cvf *mysearchstring*
% tar -xvf *mysearchstring*
当然,匹配 *mysearchstring* 的文件名会有空格。但是 shell [tcsh,bash] 会将该文件名(包括其空格)分配给 tar 的单个参数。
您可以使用简单的 C 或 C++ 程序来验证这一点。例如:
#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 [quoted wordlist] 选项的原因...
例如 [tcsh]
foreach FILE ( *mysearchstring* )
tar -xvf $FILE:q
end
或者tar -xvf "$FILE"而不是tar -xvf $FILE:q,如果您愿意的话。
如果你真的必须使用ls ...
使用ls通过任何管道传输将每行输出一个文件名。使用tr我们可以将换行符转换为任何其他字符,例如 null。 xargs可以接收以空字符结尾的字符串。这规避了空间问题。使用-n1将克服多文件问题。
例如:\ls | grep 我的搜索字符串 | tr '\012' '\0' | xargs --null -n1 焦油 -xvf
但我不相信tar可以像 OP 那样容纳来自标准输入的多个 tar 文件......