Как запустить команду в списке каталогов, используя bash? - PullRequest
0 голосов
/ 26 сентября 2011

Мне нужно выполнить несколько команд в каталогах пользователей OS X, кроме «Shared» и нашей локальной учетной записи администратора.До сих пор у меня есть:

#!/bin/bash
userFolders=$(find /Users/ -type d -depth 1 | sed -e 's/\/\//\//g' | egrep -v "support|Shared")
for PERSON in "$userFolders"; do
    mkdir $PERSON/Desktop/flagFolderForLoop
done

Запустив вышеперечисленное как root, я получаю

mkdir: /Users/mactest1: File exists

Где я могу ошибаться?

Ответы [ 2 ]

1 голос
/ 26 сентября 2011

Вы должны удалить кавычки вокруг "$userFolders", чтобы ваш цикл правильно перебирал каждого человека.

Следующий пример иллюстрирует разницу между цитированием и отсутствием цитирования:

С цитатами:

for i in "a b c"
do
    echo "Param: $i"
done

печатает только один параметр:

Param: a b c

Без кавычек:

for i in a b c
do
    echo "Param: $i"
done

печатает каждый параметр:

Param: a
Param: b
Param: c

Также вы можете указать find исключить определенные каталоги, например:

for PERSON in $(find /Users/ -type d -depth 1 ! -name support ! -name Shared)
do
    mkdir "$PERSON"/Desktop/flagFolderForLoop
done
0 голосов
/ 27 сентября 2011

Вместо find вы можете использовать dscl для вывода списка (обычный, стандартный) /Users в Mac OS X.

dscl . -list  /Users NFSHomeDirectory

# list name of users
dscl . -list /Users NFSHomeDirectory | 
   awk '/^[^[:space:]]+[[:space:]]+\/Users\//{print $1}'

# list home directories of users
dscl . -list /Users NFSHomeDirectory | 
   awk '/^[^[:space:]]+[[:space:]]+\/Users\//{$1=""; sub(/^ */,""); print $0}'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...