在bash中传输带有空格的路径

在bash中传输带有空格的路径,bash,quotes,Bash,Quotes,我试图在目录上的每个文件上运行一个程序。 但文件名中有空格。例如,一个文件可以命名为«/my/good/path/my-sorry,file.DOC» 当我试图将路径发送到另一个工具(python脚本)时,我得到一个错误,说«my»不是现有文件:( 以下是我当前的bash代码: #!/usr/bin/bash for file in $(find "/my/pash" -name "*.DOC") do newvar=`program "$file"` done 那么…我的问题在哪里

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

以下是我当前的bash代码:

#!/usr/bin/bash

for file in $(find "/my/pash" -name "*.DOC")
do
    newvar=`program "$file"`
done
那么…我的问题在哪里

谢谢大家:)

请注意,这只修复了文件名中有空格或制表符的情况。如果文件名中有一个换行符,则它将被删除


请注意,这只修复了文件名中有空格或制表符的情况。如果文件名中有一个换行符,则它将被删除。

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

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

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

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

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


for
循环用于迭代单词而不是行。给定的(不带引号的)字符串受(这正是困扰您的)和约束,然后您迭代生成的单词。可以将IFS设置为仅包含换行符。最安全的方法是使用
find-print0
xargs-0
,如一些正确答案所示,但到目前为止没有解释:


for
循环用于迭代单词而不是行。给定的(不带引号的)字符串受(这正是困扰您的)和约束,然后您迭代生成的单词。可以将IFS设置为仅包含换行符。最安全的方法是使用
find-print0
xargs-0
,如所示,这是因为for循环将把find结果中的每个单词作为元素进行迭代<代码>对于将其视为:

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 "{}"

这是因为for循环将把find结果中的每个单词作为元素进行迭代<代码>对于将其视为:

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 "{}"

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