ls:无法访问* .jpg:没有此类文件或目录

时间:2019-04-23 22:01:47

标签: bash

我正在尝试创建一个带有文件列表的变量,以便可以迭代它们。我是这样的:

FILES=(`ls *.jpg`)
FILES="${FILES[@]}"

当我运行此脚本时,它只会抛出:

ls: cannot access *.jpg: No such file or directory

我已经找到了其他类似问题的答案,并且我很确定这不是权限问题,因为在前面添加sudo不会产生任何影响,我是root。我还检查了脚本本身的权限,它们是-rwxr-xr-x,所以我觉得在那里很好。

有什么主意我可以解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

Shellcheck干净的代码演示了如何使用文件列表可靠地填充Bash数组:

void paintEvent(QPaintEvent* e) {
    QPainter painter{this};
    //and now fill the background!
    painter.setBrush(QColor(r.value(), g.value(), b.value(), a.value()));
  • Shellcheck会发现Bash(和其他Shell)代码存在许多问题。如果您在问题的代码上放置shebang行,并将其提交给Shellcheck,则会发现几个问题。
  • #! /bin/bash -p shopt -s nullglob # Make globs that match nothing expand to nothing shopt -s dotglob # Make globs match files whose names start with dot files=( *.jpg ) declare -p files 可以防止shopt -s nullglob之类的全局模式在没有任何匹配时扩展为自身。这样的扩展是问题中显示错误消息的原因。运行代码的目录中没有'.jpg'文件,*.jpg的字面量为ls,它正确地抱怨文件*.jpg不存在。
  • *.jpg与问题代码一起使用将不起作用,因为在没有shopt -s nullglob文件的目录中运行它会导致它创建 all 列表。目录中的文件(名称以点开头的文件除外)。如果任何文件名包含空格或glob模式,则该列表将显示为乱码。名称以'-'开头的文件会导致.jpg做意外的事情。
    在Bash程序中通常不需要使用ls的输出,并且使用它通常很危险。参见why you shouldn't parse the output of ls(1)Bash Pitfalls #1 (for f in $(ls *.mp3))
  • ls确保列表中包含名称以点开头的文件(例如“ .image.jpg”)。如果您不想要,请不要使用。
  • 我将shopt -s dotglob替换为FILES是因为大写变量名称可能会与环境变量或shell内置变量发生冲突。参见Correct Bash and shell script variable capitalization
  • files仅以清晰明确的方式打印declare -p files的值。