在bash中传输带有空格的路径
我试图在目录上的每个文件上运行一个程序。 但文件名中有空格。例如,一个文件可以命名为«/my/good/path/my-sorry,file.DOC» 当我试图将路径发送到另一个工具(python脚本)时,我得到一个错误,说«my»不是现有文件:( 以下是我当前的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 那么…我的问题在哪里
#!/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
选项以查找,否?