排除目标重定向文件在 for 循环中处理

排除目标重定向文件在 for 循环中处理

这将导致LIST变得非常大(甚至在短时间内增长几个 GB 等):

$ for i in *; do echo $i; cut -d '   ' -f1 $i ; done > LIST

例如,10秒后:

$ wc -l LIST
132654955 LIST
$ ls -hl LIST
-rw-r--r-- 1 user users 2.3G Jan 22 21:35 LIST

我认为原因是它LIST被添加到应该处理的文件列表中并且cut永远不会完成处理。我找到了这个问题的3个解决方案:

  • LIST从处理中排除:

    for i in !(LIST); do echo $i; cut -d '     ' -f1 $i ; done > LIST
    
  • 使用另一个目录LIST

    for i in *; do echo $i; cut -d '     ' -f1 $i ; done > /tmp/LIST
    
  • *在运行循环之前展开C-x *$ bind -p | grep glob-expand-word显示任何内容

我的推理正确吗?哪种方法最好?

答案1

你的推理是正确的。

在您提出的解决方案中,我更喜欢前两个,特别是第二个,因为写入位于另一个目录中的文件似乎更干净。

这是使用变量的另一个选项GLOBIGNORE(假设您的 shell 支持此选项):

GLOBIGNORE=LIST  ## "LIST" file will be ignored while globbing
for i in *; do echo "$i"; cut -d '   ' -f1 "$i"; done >LIST

答案2

如果您对文件夹中的每个文件执行活动并将输出文件放在同一文件夹中,我认为这不是一个明智的方法。我的>输出重定向总是以 结尾/tmp,除非我知道那里没有足够的空间用于输出。然后我寻找更适合它的文件系统。但切勿将它们放在我处理输入文件的同一目录中。

相关内容