我正在尝试在 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 the
find 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`