【问题标题】:How do I run a command in a list of directories using bash?如何使用 bash 在目录列表中运行命令?
【发布时间】:2011-11-25 09:21:10
【问题描述】:

我需要在 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

我可能哪里出错了?

【问题讨论】:

    标签: macos bash loops


    【解决方案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
    

    【讨论】:

    • 您也可以使用findexec 选项,我猜...这些行上的某些内容可能是:find /Users/ -type d -depth 1 ! -name support ! -name Shared -exec mkdir {}/Desktop/flagFolderForLoop \; 以摆脱for 循环。顺便说一句,在我使用的 Ubuntu 系统上,find 没有名为 depth 的选项,而是有 maxdepth,虽然不确定 OSX
    【解决方案2】:

    您可以使用dscl 代替find 在Mac OS X 上列出(常规、标准)/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}'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-13
      • 1970-01-01
      • 2022-08-15
      • 1970-01-01
      • 2016-01-20
      • 2019-08-13
      • 1970-01-01
      • 2015-10-31
      相关资源
      最近更新 更多