2011-09-19 98 views
12

我通过某些文件循环(所有文件开始MOVIE)的文件夹与此bash脚本代码:巴什脚本,遍历文件夹中的文件失败

for i in MY-FOLDER/MOVIE* 
do 

当有文件,工作正常文件夹。但是,如果没有,它会以某种方式继续进行,它认为它被命名为MY-FOLDER/MOVIE *。

如何避免它如果没有该文件夹中的所有文件后

do 

进入东西呢?

回答

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

find效用是Linux的瑞士军刀之一。根据您提供的选项,它从您提供的目录开始,并找到所有子目录中的所有文件。

-type f只会找到普通文件(不是目录)。

正如我写的那样,该命令也会在子目录中找到文件;你可以通过加入-maxdepth 1

+1

找到的是瑞士军刀,属实。但是用for循环的方式很容易在包含空格的文件上失败。 –

+1

此外,由于您离开我没有引用,这将在'echo $ i'上分割。参见[此](http://stackoverflow.com/a/7039579/3076724),用于更好的语法的例子。 – BroSlow

13

使用nullglob选项。

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

即使没有'nullglob'选项,你的代码对我有用,我做错了什么? –

+0

@DenisGolomazov:你有匹配的文件。尝试使用不匹配文件的glob。 –

+0

谢谢,明白了。结果是'zzz *'。 –

3
 
for file in MY-FOLDER/MOVIE* 
do 
    # Skip if not a file 
    test -f "$file" || continue 
    # Now you know it's a file. 
    ... 
done