2014-02-05 3 views
0

Я пытаюсь выполнить петлю через каталог (не рекурсивный), и я хочу только указать имя каталога, а не путь.Loop thru directory and return directory name

find /dir/* -type d -prune -exec basename {} \; 

Это возвращает список каталогов в каталоге и работает.

folder 1 
this is folder2 

И я хочу, чтобы петля через это, так что я сделал:

for i in $(/dir/* -type d -prune -exec basename {} \;) 
do 
    echo ${i} 
done 

Но цикл петли через каждое слово и не грести. что приводит к следующему:

folder 
1 
this 
is 
folder2 

Я знаю, что на этом много потоков, но я не нашел никого, кто работает для меня. Особенно с пробелами в названии.
Кто-нибудь знает, как это решить?

ответ

0

Используйте while петли вместо:

find /dir/* -type d -prune -exec basename {} \; | while IFS= read -r line 
do 
    echo "$line" 
done 
+0

Ницца, кажется, работает. Я буду работать с этим. Благодарю. – Patrik

1

Если вы хотите перебрать имена каталогов, то вы можете использовать;

(cd /dir && for f in */; do echo "$f"; done) 

В случае, если вы хотите, чтобы петли через находки результаты только тогда лучший способ сделать это:

while read -r f; do 
    echo "$f" 
done < <(find /dir/ -type d -prune -exec basename '{}' \;) 

Это является предпочтительным, поскольку он позволяет избежать нереста подоболочки (хотя find -exec создаст подоболочку).

Смежные вопросы