循环使用Bash中的空目录内容

时间:2015-05-05 02:20:18

标签: bash loops

我正在编写一个shell脚本,我需要在其中循环遍历目录,然后循环遍历其中的文件。所以我写了这个函数:

public static class Extensions
{
    public static IEnumerable<T> Merge<T>(this IEnumerable<T> first,
                IEnumerable<T> second, Func<T, T, T> operation)
    {
         using (var iter1 = first.GetEnumerator())
         using (var iter2 = second.GetEnumerator())
         {
             while (iter1.MoveNext())
             {
                 if (iter2.MoveNext())
                 {
                     yield return operation(iter1.Current, iter2.Current);
                 }
                 else
                 {
                     yield return iter1.Current;
                 }
             }
             while (iter2.MoveNext())
             {
                 yield return iter2.Current;
             }
         }
     }
}

问题是它在空目录上回复了类似* path / to / dir / **的内容。

有没有办法使用这种方法并忽略那些目录?

2 个答案:

答案 0 :(得分:6)

您可以启用nullglob option。它会导致不匹配的globs扩展为空列表而不是未扩展。

shopt -s nullglob

答案 1 :(得分:2)

您可以从目录名称中删除*,而不是完全忽略它:

[[ $file == *"*" ]] && file="${file/%\*/}"
#this goes inside the second loop

或者如果你想忽略空目录:

[[ -d $dir && $ls -A $dir) ]] || continue
#this goes inside the first loop

另一种方式:

files=$(shopt -s nullglob dotglob; echo "$dir"/*)
(( ${#files} )) || continue
#this goes inside the first loop

或者您可以打开nullglob(由Etan Reisner提及)和dotglob完全打开:

shopt -s nullglob dotglob
#This goes before first loop.

<小时/> From Bash Manual

  

了nullglob

     

如果设置,Bash允许不匹配任何文件的文件名模式进行扩展   到一个空字符串,而不是自己。

     

dotglob

     

如果设置,Bash包含在结果中以'。'开头的文件名   文件名扩展。

注意:dotglob包含隐藏文件(名称开头有.的文件)