如何使用bash在目录列表中运行命令?

时间:2011-09-26 16:59:46

标签: macos bash loops

我需要在OS X用户目录中运行一些命令,除了“共享”和我们的本地管理员帐户。 到目前为止,我有:

#!/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 个答案:

答案 0 :(得分:1)

您应该删除"$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

答案 1 :(得分:0)

您可以使用find在Mac OS X上列出(常规,标准)dscl,而不是/Users

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}'