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
这样的glob模式在不匹配时扩展到自身。这种扩展是问题中显示的错误消息的原因。运行代码的目录中没有“.jpg”文件,*.jpg
被赋予一个ls
的文本参数,它正确地抱怨文件*.jpg
不存在*.jpg
- 将
与问题中的代码一起使用将不起作用,因为在没有shopt-s nullglob
文件的目录中运行它将导致它创建目录中所有文件的列表(名称以点开头的文件除外)。如果任何文件名包含空格或glob模式,则列表将被乱码。名称以“-”开头的文件将导致.jpg
执行意外操作。ls
在Bash程序中通常不需要使用
的输出,使用它通常是危险的。见和ls
确保名称以点开头的文件(例如,.image.jpg')将包含在列表中。如果你不想用,就不要用shopt-s dotlob
- 我将
替换为文件
,因为大写变量名可能与环境变量或shell内置变量冲突。看文件
仅以清晰明确的方式打印declare-p files
的值files
FILES=(*.jpg)
(请参阅),第二行将FILES
作为一个数组和一个普通变量处理,这样做没有任何意义(并且会产生不良后果);例如,ls/some/nonexistent/dir/*.jpg
通常会打印一个“没有这样的文件或目录”错误,但使用nullglob
它会列出当前工作目录的内容。因此,我建议您在需要时使用shopt-u nullglob
将其关闭。