4

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?

4

2 回答 2

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
于 2008-12-17T00:34:01.287 回答
0

外壳通配符扩展有什么问题?(假设只有一个文件名。)

% 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 文件......

于 2008-12-17T08:27:01.567 回答