2017-03-10 199 views
0

我有以下代碼,它創建一個數組並遍歷一個目錄,並在數組的每個元素下創建一個子目錄。Bash腳本迭代目錄和創建子目錄

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

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

雖然它回顯所有的目錄,但它只在數組的最後一個元素上創建一個目錄。可能是什麼問題?

+0

包括您find命令的輸出。看到這個帖子:http://unix.stackexchange.com/questions/162411/find-maxdepth-0-not-returning-me-any-output – codeforester

回答

0

問題的數組初始化 - 將其更改爲:

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

然而,上述說法是有問題的,如果你有一個對他們有空格的目錄。

您可以使用一個簡單的水珠而不是 - 它處理空格太:

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

其實這樣它列出了/ var/www中的所有目錄和子目錄,但是我只需要完全在/ var/www –

+0

的目錄明白了。請參閱最新的答案。 – codeforester

+1

謝謝。公認。 –

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 

,但如果你可以做這件事只是發現和的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'