Bash脚本迭代目录并创建子目录

时间:2017-03-10 19:27:41

标签: arrays bash loops directory

我有以下代码创建一个数组并遍历一个目录并在数组的每个元素下创建一个子目录。

#!/bin/bash
cd /var/www
dirs=$(find * -maxdepth 0 -type d)

for dir in "${dirs[@]}"; do
        echo $dir
        mkdir $dir/backups
done

虽然它回显了所有目录,但它只在数组的最后一个元素上创建一个目录。可能是什么问题?

2 个答案:

答案 0 :(得分:1)

如果您特别使用bash 4.4,则可以使用下面的readarray功能。同样使用-maxdepth 0似乎不是一个好选择 - 你可能需要使用-maxdepth 1.

#!/bin/bash
cd /var/www
readarray -t -d'' dirs < <$(find . -maxdepth 1 -type d -print0)

for dir in "${dirs[@]}"; do
        echo $dir
        mkdir $dir/backups
done

但是如果你能用find和mkdir -v(详细)完成整个事情:

$ find . -maxdepth 1 -type d -name 'a*'
./appsfiles

$ find . -maxdepth 1 -type d -name 'a*' -exec mkdir -v {}/backup \;
mkdir: created directory './appsfiles/backup'

使用mkdir -v从mkdir获取详细消息,您可以跳过回声 如果你还需要回声,你可以这样做:

$ find . -maxdepth 1 -type d -name 'a*' -exec bash -c 'echo $0 && mkdir -v $0/backup' {} \;
./appsfiles
mkdir: created directory './appsfiles/backup'

答案 1 :(得分:0)

数组初始化的问题 - 将其更改为:

dirs=($(find * -maxdepth 0 -type d))

但是,如果您的目录中包含空格,则上述语句可能会出现问题。

您可以使用简单的glob - 它也可以处理空格:

cd /var/www
dirs=(*/)
for dir in "${dirs[@]}"; do
  : your code
done