【问题标题】:Redirecting stdout with find -exec使用 find -exec 重定向标准输出
【发布时间】:2015-05-09 01:48:16
【问题描述】:

我想把一个文件夹及其子文件夹下的所有文件合并成一个文件total.txt,所以我试试

find . -type f -exec cat {} +; > total.txt

输出无法重定向

管道也不能工作:

find . -type f -exec cat {} + | cat > total.txt

这可能是由-exec 引起的,它将其后面的所有参数作为命令?

对吗?以及如何解决?或者有没有更好的方法来实现这一点。

任何帮助将不胜感激:)

【问题讨论】:

  • 我发现你的第二种方法效果很好。你觉得它有什么问题?
  • @nobar 它运行了很长时间,似乎永远不会结束
  • 我打赌那是因为它正在将 total.txt 复制到自身中。当我用小文件进行测试时,这并没有发生,但是当我在文件夹中有足够的内容时,它确实发生了——它可能会继续读取和写入不断增长的 total.txt,直到它填满磁盘。这就是为什么威廉建议复制到.. 而我建议使用! -path ./total.txt

标签: linux shell find


【解决方案1】:

有几个问题。分号终止命令,因此您正在运行两个命令,第二个是空重定向。其次,你需要防止 find 找到它正在写入的文件,一个简单的方法就是将它移到一个目录中:

 find . -type f -exec cat {} + > ../total.txt

【讨论】:

    【解决方案2】:

    这里有一个简单的方法...

    ## WARNING: this only works for simple cases...
    cat $(find ! -path ./total.txt -type f ) >total.txt
    

    这是另一种方式,它对各种特殊情况更加健壮,例如文件名中的空格或大量文件...

    find ! -path ./total.txt -type f -print0 |xargs -0 cat >total.txt
    

    【讨论】:

    • 顺便说一下,! -path ./total.txt 仅基于您要将文件写入您正在扫描的同一目录的假设。
    • 谢谢,它有效!能否请您简要解释一下$ 的用法
    • @simon_xia: 是command substitution -- 命令的输出替换了命令行上的命令。例如cat $(ls *.txt) 可能会变成cat file1.txt file2.txt
    • 当你有正确的表格时,为什么还要显示错误的表格?
    • @CharlesDuffy:指出更简单方法的局限性很有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-20
    • 2011-12-08
    相关资源
    最近更新 更多