我有下面的代码,它创建一个数组并遍历一个目录,并在数组的每个元素下创建一个子目录。
#!/bin/bash
cd /var/www
dirs=$(find * -maxdepth 0 -type d)
for dir in "${dirs[@]}"; do
echo $dir
mkdir $dir/backups
done
虽然它回显所有目录,但它只在数组的最后一个元素上创建一个目录。有什么问题吗?
发布于 2017-03-10 19:29:51
发出数组初始化-将其更改为:
dirs=($(find * -maxdepth 0 -type d))
但是,如果您的目录中有空白,那么上面的语句可能会有问题。
您可以使用一个简单的glob -它也处理空白:
cd /var/www
dirs=(*/)
for dir in "${dirs[@]}"; do
: your code
done
发布于 2017-03-10 20:21:45
特别是在bash4.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'
https://stackoverflow.com/questions/42726281
复制相似问题