Назад | Перейти на главную страницу

Как предотвратить разделение имен каталогов «for»?

Я пытаюсь перечислить все скрытые каталоги с помощью цикла «for»:

for i in ``ls -a | grep '^\.'` `;
do 
    echo $i
done

Проблема в том, что цикл делит некоторые имена каталогов на две части.

Например: ls -a | grep '^\.' дает мне

.
..
.Deleted Items
.Drafts 
.Junk
.Junk E-mail
.Sent
.Sent Items
.Trash

Но мой цикл дает мне:

.
..
.Deleted
Items
.Drafts
.Junk
.Junk
E-mail
.Sent
.Sent
Items
.Trash

Как мне улучшить мой скрипт, чтобы он не разделял имена каталогов?

Вам не нужен ls команда, поскольку оболочка сделает расширение за вас, и вы должны указать " переменная

for i in .*/
do
echo "$i"
done

Если нет особой потребности в 'for', вы можете попробовать цикл while:

ls -d .* | while read Name  
do  
    echo "$Name"  
done  

Есть множество способов обойти это, от поиска до дополнительных цитат и т. Д.

Лично я считаю полезным изменить переменную IFS. IFS используется для определения символа разрыва между элементами списка для for и тому подобное. Итак, установите IFS как новую строку через IFS=$'\n'. Это сделает for цикл чтения до конца строки ввода, прежде чем начать новый элемент в его списке. Возможно, это не самый простой способ решить эту конкретную проблему (ответ Иана более элегантен), но я нашел его весьма полезным в ряде ситуаций.

Несколько дней назад я столкнулся с аналогичной проблемой и эта тема было очень полезно. Надеюсь, вы найдете там вдохновение.