Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash ls:无法访问*.jpg:没有这样的文件或目录_Bash - Fatal编程技术网

Bash ls:无法访问*.jpg:没有这样的文件或目录

Bash ls:无法访问*.jpg:没有这样的文件或目录,bash,Bash,我试图创建一个包含文件列表的变量,这样我就可以遍历它们。我是这样做的: FILES=(`ls *.jpg`) FILES="${FILES[@]}" 当我运行此脚本时,它只会抛出: ls: cannot access *.jpg: No such file or directory 我已经看了一些类似问题的其他答案,我相当确定这不是权限问题,因为将sudo添加到前面没有任何效果,我是root。我还检查了脚本本身的权限,它们是-rwxr-xr-x,因此我认为我在这方面做得很好 知道如何解决这个

我试图创建一个包含文件列表的变量,这样我就可以遍历它们。我是这样做的:

FILES=(`ls *.jpg`)
FILES="${FILES[@]}"
当我运行此脚本时,它只会抛出:

ls: cannot access *.jpg: No such file or directory
我已经看了一些类似问题的其他答案,我相当确定这不是权限问题,因为将
sudo
添加到前面没有任何效果,我是
root
。我还检查了脚本本身的权限,它们是
-rwxr-xr-x
,因此我认为我在这方面做得很好

知道如何解决这个问题吗?

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

#! /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
  • 可以发现Bash(和其他shell)代码存在许多问题。如果您在问题中的代码上画一行并提交给它,它将识别出几个问题
  • shopt-s nullglob
    防止像
    *.jpg
    这样的glob模式在不匹配时扩展到自身。这种扩展是问题中显示的错误消息的原因。运行代码的目录中没有“.jpg”文件,
    ls
    被赋予一个
    *.jpg
    的文本参数,它正确地抱怨文件
    *.jpg
    不存在
  • shopt-s nullglob
    与问题中的代码一起使用将不起作用,因为在没有
    .jpg
    文件的目录中运行它将导致它创建目录中所有文件的列表(名称以点开头的文件除外)。如果任何文件名包含空格或glob模式,则列表将被乱码。名称以“-”开头的文件将导致
    ls
    执行意外操作。
    在Bash程序中通常不需要使用
    ls
    的输出,使用它通常是危险的。见和
  • shopt-s dotlob
    确保名称以点开头的文件(例如,.image.jpg')将包含在列表中。如果你不想用,就不要用
  • 我将
    文件
    替换为
    文件
    ,因为大写变量名可能与环境变量或shell内置变量冲突。看
  • declare-p files
    仅以清晰明确的方式打印
    files
    的值

这对我来说非常有效。在您运行脚本的目录中有一些.jpg文件?您实际上想要完成什么?在大多数情况下,第一行最好作为
FILES=(*.jpg)
(请参阅),第二行将
FILES
作为一个数组和一个普通变量处理,这样做没有任何意义(并且会产生不良后果);例如,
ls/some/nonexistent/dir/*.jpg
通常会打印一个“没有这样的文件或目录”错误,但使用
nullglob
它会列出当前工作目录的内容。因此,我建议您在需要时使用
shopt-u nullglob
将其关闭。