【问题标题】:Transfer a path with space in bash在 bash 中传输带空格的路径
【发布时间】:2015-06-09 13:38:58
【问题描述】:

我正在尝试对目录中的每个文件运行一个程序。 但是文件名中有空格。例如,一个文件可以命名为 «/my/good/path/MY - AWFUL, FILE.DOC» 当我尝试将路径发送到我的另一个工具(python 脚本)时,我收到一条错误消息,提示 «MY» 不是现有文件。 :(

这是我当前的 bash 代码:

#!/usr/bin/bash

for file in $(find "/my/pash" -name "*.DOC")
do
    newvar=`program "$file"`
done

那么……我的问题在哪里?

谢谢大家:)

【问题讨论】:

  • 所有文档都在同一个目录下,还是在子目录下?
  • 它们在子目录中。像 «my/path/sub1/MY FILE WITH - SPACES, AND, COMMAS.DOC»
  • find '/my/path' -name '*.DOC' -exec script.py {} \; 就足够了吗?
  • 有多少问题是重复的?
  • 你如何处理newvar中捕获的字符串?您必须一次处理一个文件,还是program 可以在一次调用中处理多个文件?如果您不需要输出并且program 只处理单个文件,那么@TomFenech 的建议很好。如果program 处理多个文件,则使用find "/my/pash" -name "*.DOC" -exec program {} ++ 代替\; 的行为或多或少类似于xargs,以方便的文件数量运行程序。

标签: bash quotes


【解决方案1】:

这是因为 for 循环会将查找结果中的每个 word 作为一个元素进行迭代。 for 将其视为:

for file in {/my/good/path/MY, -, AWFUL, FILE.DOC}
    echo "$file"
done

并将打印:

/my/good/path/MY
-
AWFUL,
FILE.DOC

解决此问题的一种方法是使用xargs 程序将find 的结果作为python 程序参数传递:

find "/my/pash" -name "*.DOC" -print0 | xargs -0 -i program "{}"

【讨论】:

  • 我觉得最好加-print0选项来查找,不是吗?
【解决方案2】:

一些正确的答案,但到目前为止还没有解释:

for 循环旨在遍历 单词 而不是行。给定的(未加引号的)字符串受word splitting(这是困扰你的地方)和filename expansion 的约束,然后你迭代生成的单词。您可以将 IFS 设置为仅包含换行符。最安全的方法是使用find -print0xargs -0,如Vytenis's answer 所示

【讨论】:

    【解决方案3】:
    #!/usr/bin/bash
    
    find "/my/pash" -name "*.DOC" | while read file; do
      newvar="$(program "$file")"
    done
    

    请注意,这只修复了文件名中包含空格或制表符的情况。如果文件名中有换行符,则为 a little more complicated

    【讨论】:

      【解决方案4】:
      find -name "*.DOC" -print0 | xargs -r -0 -n1 program
      

      【讨论】:

        【解决方案5】:

        循环将空格视为分隔符,所以试试这个:

        find "/my/pash" -name "*.DOC" | while read file; do 
           newvar=`program "$file"`
        done
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-07-03
          • 1970-01-01
          • 2011-11-24
          • 2014-05-18
          • 2012-10-05
          • 1970-01-01
          相关资源
          最近更新 更多