Bash脚本编写,循环遍历文件夹失败。

16

我正在使用以下Bash脚本代码循环遍历文件夹中以MOVIE开头的特定文件:

for i in MY-FOLDER/MOVIE*
do

如果文件夹中有文件,那么它可以正常工作。但是当没有文件时,它会继续执行并认为其中一个名为MY-FOLDER/MOVIE*的文件存在。

我该如何避免它进入后续操作?

do

如果文件夹中没有任何文件怎么办?

3个回答

14

使用 nullglob 选项。

$ shopt -s nullglob
$ for i in zzz* ; do echo "$i" ; done
$ 

你的代码在没有使用 nullglob 选项的情况下对我来说是有效的,那我做错了什么? - Dennis Golomazov
1
@DenisGolomazov:您有匹配的文件。尝试使用不匹配任何文件的通配符。 - Ignacio Vazquez-Abrams

12
for i in $(find MY-FOLDER/MOVIE -type f); do
  echo $i
done

find工具是Linux中瑞士军刀之一。它从您提供的目录开始,根据您给出的选项在所有子目录中查找所有文件。

-type f将仅查找常规文件(而不是目录)。

正如我所写的那样,该命令还将在子目录中查找文件;您可以通过添加-maxdepth 1来防止这种情况。


8年后进行编辑(感谢@tadman的评论!)

您可以完全避免使用循环

find . -type f -exec echo "{}" \;

这会告诉find用其名称替换{}并打印出每个文件的名称。转义分号是必要的,以终止传递给-exec的命令。


1
find 像瑞士军刀一样实用,没错。但是如果在 for 循环中这样使用它,就容易在文件名中含有空格时失败。 - bash-o-logist
1
另外,由于您未将I加引号,因此这将在“echo $i”处分割。请参阅此处以获取更好语法的示例。 - Reinstate Monica Please
如果您的文件名中有空格,这将无法正常工作。 - tadman

3
对于 MY-FOLDER/MOVIE* 中的每个文件:
如果不是一个文件则跳过;
现在你知道它是一个文件。
...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接