2016-08-10 82 views
0

我是新來的腳本/編程/一切,似乎無法弄清這個bash腳本/循環我試圖迭代。嵌套循環在bash中沒有正確迭代?

我有一個名爲「文件夾」目錄,其中有很多的子目錄,每個包含我想呼應(現在)的文件

我有這個,但它似乎並沒有打印子目錄內的文件,而是自己打印子目錄。我將如何改變腳本來完成這項工作?

for directory in *; 
do 
     for thing in $directory 
     do 
       echo $thing 
     done 
done 
+2

你不想'$ {目錄}/*'?或者perphaps'(cd「$ directory」;對於*中的東西;做echo $ thing; done;)'。 – Droppy

回答

3

for循環本身不遍歷文件系統;它只是遍歷一系列字符串。您需要遍歷第二個循環的路徑名擴展的結果。

for directory in *; 
do 
    for thing in "$directory"/* 
    do 
     echo "$thing" 
    done 
done 

你可以用一個循環具有更復雜的模式做到這一點:

for thing in */*; do 
    echo "$thing" 
done 
+0

不循環,你的意思是'some_command */*'嗎?我假定內部循環的主體比單個內置命令更復雜,在這種情況下,這會對大量匹配產生問題。 – chepner

1

猛砸4.0版增加了所謂的globstar它把圖案**不同,當我們設置一個新的通配選擇。

#!/bin/bash 
shopt -s globstar 
for file in folder/** # with '**' bash recurses all the directories 
do 
    echo "$file" 
done 
+1

該數組是無關的,並可能是內存泄漏;你可以直接遍歷模式,這(我認爲)不需要將完整的匹配存儲在內存中。 – chepner

+0

@chepner:好尖!更改 – sjsam