2015-10-26 81 views
1

我有一个变量为list_of_files的文件列表。所以,如果我运行下面的命令Bash在for循环中抱怨“没有这样的文件或目录”

for file_path in $list_of_files; do 
    echo "=${file_path}=" 
done 

它给了我这个

=./a.py= 
=./b.py= 
=./c.py= 

这意味着file_path包含一个相对路径文件,而之前或之后任何多余的空格。

但是,如果使用cat而不是echo,它抱怨“没有这样的文件或目录”

for file_path in $list_of_files; do 
    cat ${file_path} 
done 

但有趣的是,如果我叫cat直接cat ./a.py,它的工作原理。

这不是猫特有的问题。原来,如果我使用if语句检查文件存在,它告诉我这些文件不存在。

for file_path in $list_of_files; do 
    if [ -f "$file_path" ] 
    then 
    echo 'OK' 
    else 
    echo 'NO' 
    fi 
done 

结果:

NO 
NO 
NO 

尝试以下方法,但也失败了。

  • 使用完整的绝对路径
  • 从所有文件路径
+1

野性预感 - 确保'$ list_of_files'没有任何多余/不合适的行结束符('\ r \ n' vs'\ n')。 – keithmo

+2

1:在脚本中添加一个“pwd”,以验证您是否在您认为自己的目录中。 2:在脚本中添加一个'set -x',打印每个正在执行的命令 - 它看起来是否合理? –

+1

在脚本中有'cat。/ a.py'工作吗? –

回答

1

的原因原来是那$list_of_files是有色删除./。所以它包含一些用于着色目的但隐藏的特殊字符!

我发现使用echo "$list_of_files" | od -An -tcx1(感谢@BinaryZebra),它显示所有为文件名着色的垃圾。

通过使用sed -r "s:\x1B\[[0-9;]*[mK]::g",我排除了这些魔术位!

相关问题