Bash抱怨"没有这样的文件或目录"在for循环中

时间:2015-10-26 23:24:39

标签: bash

我在变量list_of_files中有一个文件列表。所以如果我运行以下命令

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 个答案:

答案 0 :(得分:2)

原因是$list_of_files已着色。因此它包含一些用于着色目的的特殊字符,但隐藏了!

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

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