【问题标题】:How to perform shell "for" command over files with spaces in names?如何对名称中带有空格的文件执行 shell“for”命令?
【发布时间】:2011-01-17 09:17:57
【问题描述】:

我发现自己经常做以下事情:

for f in `find -foo -bar -baz`; do
  process "$f"
done

这当然不适用于带有空格的文件名。我该如何处理这种情况?

【问题讨论】:

    标签: bash command-line shell find


    【解决方案1】:

    Find 和 xargs 可以很好地协同工作。 find 可以使用\0-delimiter(选项print0)打印文件的名称,xargs 可以以该格式读取它们(选项-0):

    find . -type f -print0 | xargs -0 echo
    

    【讨论】:

    【解决方案2】:
    find . -type f | while read file; do 
         process "$f"
    done;
    

    【讨论】:

    • 这正是我所需要的。谢谢!
    • "$f" 应该是 "$file"。使用while read -r 在文件名中使用文字反斜杠
    【解决方案3】:

    如果你已经在使用 find ,为什么不直接使用 exec

    find -foo -bar -baz -exec process '{}' \;
    

    替代解决方案是更改 IFS 变量(字段间分隔符)

    【讨论】:

      【解决方案4】:

      重击 4

      shopt -s globstar
      for file in /path/**
      do
        process "$file"
      done
      

      【讨论】:

        【解决方案5】:

        在这种情况下,我的方法是在for 命令之前构建列表,并将元素名称中的空格替换为另一个不太可能出现的字符或字符串。

        然后在循环内,我用空格替换那个特定的字符串。

        一个例子:

        list=`find -foo -bar -baz | tr ' ' 'µ'`
        for fx in $list ; do
            f=`echo $fx | tr 'µ' ' '`
            process "$f"
        done
        

        【讨论】:

        • 这是冗长且不可靠的。
        猜你喜欢
        • 1970-01-01
        • 2019-09-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-02
        相关资源
        最近更新 更多