【问题标题】:input file is output file error输入文件是输出文件错误
【发布时间】:2014-06-25 19:33:29
【问题描述】:

我正在尝试运行命令

find . -name "*.csv" | xargs -I{} cat '{}' > Everything2.csv

我回来了:

cat: ./Everything2.csv: 输入文件就是输出文件

这是什么意思?

【问题讨论】:

  • 表示输入文件就是输出文件。 find 正在查找 Everything2.csv 并且 xargs 正在以 Everything2.csv 作为输入文件调用 cat
  • 如果您想使用xargsfind . -name '*.csv' -print0 | xargs -0 cat 通常是更安全的做法。如果某些 CSV 文件的名称中有空格或引号,请查看现有代码的作用;不漂亮。

标签: bash shell syntax-error cat


【解决方案1】:

answer所示,你应该运行:

$ find . -name '*.csv' -exec cat {} + | tee Everything2.csv

由于重定向运算符(>>>)具有更高的优先级,因此它在调用 find 命令之前创建/截断文件。因此,为避免您需要先生成列表,然后将其通过管道传输到文件中,但不使用重定向运算符,因此 tee 在这种情况下可以正常工作。

或者使用sponge 而不是cat,它吸收标准输入并写入文件:

find . -name "*.csv" | xargs -I{} sponge '{}' > Everything2.csv

【讨论】:

  • 建议的代码仅在输出文件不存在时才有效。如果存在我们要替换其内容的文件,则可能会出现同样的问题。
【解决方案2】:

告诉find从其结果中排除输出文件以防止此循环:

find . -name Everything2.csv -prune -o \
       -name '*.csv' -exec cat {} + \
  >Everything2.csv

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-18
    • 1970-01-01
    相关资源
    最近更新 更多