在bash中传输带空格的路径

时间:2015-04-04 17:47:08

标签: bash quotes

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

这是我目前的bash代码:

#!/usr/bin/bash

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

所以......我的问题在哪里?

谢谢大家:)

5 个答案:

答案 0 :(得分:2)

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

for循环旨在迭代而不是行。给定的(未引用的)字符串受word splitting(这令您不安)和filename expansion的约束,然后迭代生成的单词。您可以将IFS设置为仅包含换行符。最安全的方法是使用Vytenis's answer

所示的find -print0xargs -0

答案 1 :(得分:1)

#!/usr/bin/bash

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

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

答案 2 :(得分:1)

find -name "*.DOC" -print0 | xargs -r -0 -n1 program

答案 3 :(得分:1)

这是因为for循环会将find结果中的每个 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 "{}"

答案 4 :(得分:0)

循环将空格视为分隔符,因此请尝试以下方法:

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