bash列出当前文件夹中的子文件夹并不给出预期结果[仅给出第一个文件夹]

时间:2015-03-15 01:59:30

标签: linux bash

我尝试列出子文件夹并将它们作为列表保存到变量

DIRS=($(find . -maxdepth 1 -mindepth 1 -type d ))

之后我想在子文件夹中做一些工作。即。

for item in $DIRS
 do     
echo $item

之后
echo $DIRS

它只提供第一项(子文件夹)。有人会指出我错误或提出另一种解决方案吗?

1 个答案:

答案 0 :(得分:1)

以下内容创建了一个bash数组,但只列出了三个子目录中的一个:

$ dirs=($(find . -maxdepth 1 -mindepth 1 -type d ))
$ echo $dirs
./subdir2

要查看所有目录,您必须使用[@][*]下标表单:

$ echo "${dirs[@]}"
./subdir2 ./subdir1 ./subdir3

或者,在循环中使用它:

$ for item in "${dirs[@]}"; do echo $item; done
./subdir2
./subdir1
./subdir3

避免分词出现问题

请注意,在上面的代码中,shell在创建数组之前执行分词。因此,如果任何子目录的名称中有空格,则此方法将失败。

  1. 以下将成功创建一个子目录名称数组,即使这些名称中包含空格,制表符或换行符:

    dirs=(*/)
    
  2. 如果您需要使用find,并且希望它对于困难的文件名是安全的,请使用查找--exec选项。

  3. 文档

    表单$dirs只返回数组的第一个元素。这在man bash

    中有记录
      

    引用不带下标的数组变量等效于引用下标为0的数组。

    [@]中还记录了[*]man bash的使用情况:

      

    可以使用$ {name [subscript]}引用数组的任何元素。需要大括号以避免与路径名扩展冲突。如果下标是@或,则该单词将扩展为name的所有成员。这些下标仅在单词出现在双引号内时有所不同。如果单词是双引号,则$ {name []}扩展为单个单词,每个数组成员的值由IFS特殊变量的第一个字符分隔,$ {name [@]}展开名称的每个元素都是一个单独的单词。