在 Mountain Lion 上 find 命令出现错误

在 Mountain Lion 上 find 命令出现错误

我正在尝试在 Mac OSX Mountain Lion 上使用以下命令来获取我的邮件文件夹列表作为 .muttrc 文件的一部分:

`echo -n "+ "; find ~/.mail/fastmail -maxdepth 1 -type d -name ".*" -printf "+'%f' "`
find: -printf: unknown primary or operator
-bash: +: command not found

我该如何重写它以获得所需的结果?

答案1

OSXfind 没有-printf行动+: command not found错误是因为您的命令被括在反引号中(“ ), so the shell is treating the results of thefind command as a command and attempting to execute them, specifically it is trying to execute+”,这是您运行的命令打印的第一件事。如果您运行

`echo -n "+"` 

反引号用于将命令的结果保存到变量中,因此上面的代码会出现错误,但是这个不会:

foo=`echo -n "+"`

您没有说明您想要的输出是什么。根据您的问题,我假设您想要获取给定目录中以 开头的所有文件夹的列表,.并在同一行上打印它们的名称,用 引号括起来并在其前面加上+。如果是这样,您可以执行以下操作:

find ~/.mail/fastmail -maxdepth 1 -type d -name ".*"  -exec echo -n "+'{}' " \;

示例输出:

+'/home/terdon/.mail/fastmail/.bar' +'/home/terdon/.mail/fastmail/.foo' 

要将此命令的输出作为输入传递给另一个程序(mailbox例如),请执行以下操作:

mailbox `find ~/.mail/fastmail -maxdepth 1 -type d -name ".*"  -exec echo -n "+'{}' " \;`

或者

mailbox $(find ~/.mail/fastmail -maxdepth 1 -type d -name ".*"  -exec echo -n "+'{}' " \;)

回应OP的评论:

如果您只想要所有文件夹,则不需要-name,要删除引号,只需不引用{}。我还假设您不想要父文件夹(fastmail),因此-mindpeth 1

find ~/.mail/fastmail -maxdepth 1 -mindepth 1 -type d -exec echo -n "+{} " \;

删除路径稍微复杂一些,因为,与你预期相反,您不能只在通话basename中使用-exec。您需要发挥创意,以下是一些选择:

  • 解析awk

    mailbox `find ~/.mail/fastmail -maxdepth 1 -mindepth 1 -type d | 
     awk -F"/" '{printf "+%s ",$NF}'`
    

    -F"/"告诉awk使用/作为字段分隔符,然后打印,+后面跟着最后一个字段($NF),它将是文件夹名称。

  • 使用for循环(假设您的文件夹名称没有奇怪的字符或空格)

       mailbox `for dir in $(
         find ~/.mail/fastmail -maxdepth 1 -mindepth 1 -type d
        ); do echo -n "+$(basename $dir) "; done`
    

    如果您的文件夹名称包含空格或奇怪的字符,请改用以下名称:

    mailbox `find ~/.mail/fastmail -maxdepth 1 -mindepth 1 -type d | 
      while IFS= read -r dir; do echo -n "+$(basename $dir) "; done`
    

相关内容