【问题标题】:Linux how do I put double quotes around a file before piping it to tar?Linux如何在将文件传送到tar之前将双引号括起来?
【发布时间】:2008-12-17 00:08:40
【问题描述】:

我使用 ls 来获取包含空格的文件名,所以它看起来像:

my file with whitespace.tar.bz2

我想通过管道将其传输到类似于以下内容的 tar:

ls | grep mysearchstring | tar xvjf

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

【问题讨论】:

  • 我不认为你的问题是在问正确的问题。您的“类似”示例实际上不会打开目录中的任何文件。

标签: linux shell pipe tar


【解决方案1】:

find 和 xargs 是一个很好的工具。例如,您可以使用:

find . -name '*.tar.bz2' -print0 | xargs -0 -n1 tar xjf

按照 pixelbeat 的建议,您也可以像这样使用 shell:

for archive in *.tar.bz2; do tar xvjf "$archive"; done

【讨论】:

  • 查找 | xargs 是最通用的,也是最高效的。对于纯 shell,以下将处理空格: for archive in *.tar.bz2;完成 tar xvjf "$archive" 完成
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2021-02-14
    • 2015-01-16
    • 2011-09-27
    • 2021-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-14
    相关资源
    最近更新 更多