Linux如何在将文件传递给tar之前在文件周围放置双引号?

时间:2008-12-17 00:08:41

标签: linux shell pipe tar

我使用ls获取具有空格的文件名,因此它看起来像:

my file with whitespace.tar.bz2

我想把它传递给tar,类似于:

ls | grep mysearchstring | tar xvjf

如何在将它引用到tar之前插入双引号?

2 个答案:

答案 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拥有它一样......