为什么测试命令明显被 for 循环变量阻塞?

为什么测试命令明显被 for 循环变量阻塞?

我想确定目录中所有损坏的符号链接。

由于不知道更好的解决方案,我尝试了这个简单的 bash 单行(bash 版本是 4.2.46,可能值得一提,因为它有点过时):

for f in $(ls); do test -L "$f" || continue; test -e "$f" || echo "$f deadlink"; done

不幸的是这不起作用。我尝试确定错误,如果我运行这个

for f in $(ls); do test -L $f && echo "$f is a valid symlink"; done

尽管存在有效的符号链接,但不会产生任何输出。如果我运行相同的命令并$f替换为实际文件名,它就可以工作。也f=filename; test -L $f && echo "$f is a valid symlink";按预期工作,因此问题似乎出在循环上。

我缺少什么?

答案1

我怀疑问题来自于ls在其输出中使用颜色。既然你是解析ls的输出,如果ls输出颜色,相应的转义码将最终出现在给定的值中f,并且test将无法找到匹配的文件。由于test在这种情况下测试失败且没有任何输出,因此您不会变得更明智。

使用 glob 代替:

for f in *; do test -L "$f" || continue; test -e "$f" || echo "$f deadlink"; done

如何找到损坏的符号链接针对您的根本问题的其他可能的解决方案。

相关内容