【问题标题】:Merging large number of files into one将大量文件合并为一个
【发布时间】:2014-01-18 19:48:18
【问题描述】:

我有大约 3 万个文件。我想将它们合并为一个。我使用了 CAT,但出现此错误。

cat *.n3 > merged.n3

-bash: /usr/bin/xargs: Argument list too long

如何增加使用“cat”命令的限制?如果有任何迭代方法可以合并大量文件,请帮助我。

【问题讨论】:

    标签: macos bash unix cat


    【解决方案1】:

    这是一种安全的方法,无需find

     printf '%s\0' *.n3 | xargs -0 cat > merged.txt
    

    (我还选择了merged.txt 作为输出文件,正如@MichaelDautermann 建议的那样;之后重命名为merged.n3)。

    注意:这样做的原因是:

    • printf 是一个 bash shell builtin,其命令行不受传递给 external 可执行文件的命令行长度限制。
    • xargs 巧妙地将输入参数(通过 pipe 传递,因此也不受命令行长度限制)分成多个调用,以避免长度限制;换句话说:xargs 在不超出限制的情况下尽可能少地拨打电话。
    • 使用 \0 作为分隔符与 xargs 的 -0 选项配对可确保所有文件名 - 即使是那些带有嵌入空格甚至换行符的文件名 - 都按原样传递。

    【讨论】:

    • +1 给你答案。除了作为一种偏好之外,还有什么理由选择使用“printf”而不是“find”?如果我们仍然使用“*.n3”作为“printf”的参数,那么O.P.不会还有“Argument list too long”的问题吗?
    • @MichaelDautermann:我更喜欢printf 的简洁性和可读性方法(只匹配当前目录而不递归,你的find 命令会变得更长)。不,"Argument list too long" 问题仅影响 external 实用程序,而 printf(至少在此处调用)是 bash builtin
    【解决方案2】:

    传统方式

    > merged.n3
    for file in *.n3
    do
      cat "$file" >> merged.n3
    done
    

    【讨论】:

    • +1。缓慢但扎实;确保输出文件 merged.n3 不存在 - 否则您将进入无限循环,文件不断增长。
    【解决方案3】:

    尝试使用“find”:

     find . -name \*.n3 -exec cat {} > merged.txt \;
    

    这会在您的目录中“查找”所有扩展名为“n3”的文件,然后将每个结果传递给“cat”命令。

    我将输出文件名设置为“merged.txt”,您可以在完成追加后将其重命名为“merged.n3”,因为您可能不希望添加新的“merged.n3”文件在自身内部。

    【讨论】:

    • 好点重新输出文件名;如果您将\; 替换为+,您将只获得cat少数 次调用(在不超出长度限制的情况下匹配尽可能多的匹配项),而不是一个每个匹配的文件;此外,您的命令将在当前目录的整个 子树 中查找文件。
    猜你喜欢
    • 1970-01-01
    • 2021-05-28
    • 2020-12-26
    • 1970-01-01
    • 1970-01-01
    • 2012-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多