【问题标题】:for loop through files with spaces and some special charactersfor 循环遍历带有空格和一些特殊字符的文件
【发布时间】:2015-10-16 14:28:01
【问题描述】:

我需要使用 for 循环运行以下命令

cat Locate\ Message.eml | ./locatePipe.php

我正在尝试以下操作,但它似乎在文件名中的第一个空格处中断

for i in $(find -name "*.eml"); do cat $i | ./locatePipe.php; done

如果重要的话,一些文件名包含“@”、“()”、“-”、“.”、“[]”、“'”

【问题讨论】:

标签: bash for-loop pipe special-characters filenames


【解决方案1】:

使用-exec 选项

find -name '*.eml' -exec cat {} + | ./locatePipe.php

【讨论】:

  • 我需要使用 for 循环,因为一次处理太多。我最终遇到了这个方法的内存问题
  • 然后使用find -name '*.eml' -exec bash -c 'cat {} | ./locatePipe.php' \;
  • -exec cat {} + 将尽可能多的文件传递给cat 的每次调用;与使用 for 循环相比,您应该拥有更少的进程,它将为每个文件启动一个 cat
【解决方案2】:

我使用以下命令完成了此操作

find -name '*.eml' | while read email; do cat "$email" | ./locatePipe.php; done

【讨论】:

    【解决方案3】:

    如果您使用的是bash 4,请跳过使用find

    shopt -s globstar
    for i in **/*.eml; do
        cat "$i"
    done | ./locatePipe.php
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-31
      • 2015-12-24
      • 1970-01-01
      • 2015-01-07
      • 2013-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多