我正在尝试在目录上的每个文件上运行程序。 但是文件名中有空格。例如,一个文件可以命名为«/ 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
所以......我的问题在哪里?
谢谢大家:)
答案 0 :(得分:2)
一些正确的答案,但到目前为止还没有解释:
for
循环旨在迭代字而不是行。给定的(未引用的)字符串受word splitting(这令您不安)和filename expansion的约束,然后迭代生成的单词。您可以将IFS设置为仅包含换行符。最安全的方法是使用Vytenis's answer
find -print0
和xargs -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