用于创建符号链接的mdfind无法按预期工作

时间:2009-12-18 20:14:35

标签: macos symlink spotlight ln

我正在尝试使用mdfind的输出来创建一堆符号链接。 mdfind的输出如下:

  

/ pathtofile1 /
  / pathtofile2 /
  / pathtofile3 /

因此,我使用sedln -s添加到每行的开头,并awk {print $0 "/directory where I want this/"};

在我的单行脚本成功输出后:

  

ln -s“/ pathtofile1 /”“/我想要的目录”
  ln -s“/ pathtofile2 /”“/我想要的目录”
  ln -s“/ pathtofile3 /”“/我想要的目录”

问题是,当我运行它时,我收到此错误:“/我想要的目录:文件不存在”

奇怪的是,当我单独运行这些行时,它们会按预期创建链接,但运行整个命令会返回上面的错误。

有什么想法吗?

我认为这不是我想要做的事情的理想方式,所以如果你有更好的解决方案,请告诉我。


编辑了更多信息。

#! /bin/bash
itemList=`mdfind -s "$1"| awk '{ print "ln -s \""$0"\" \"/Users/username/Local/Recent\""}'`
echo "$itemList"
`$itemList`

$ 1是一个测试* .savedSearch,它返回一个文件列表。

我的结果(来自回声)是:

ln -s "/Users/username/Dropbox/Document.pdf" "/Users/username/Local/Recent"
ln -s "/Users/username/Dropbox/Document2.pdf" "/Users/username/Local/Recent"

我得到的错误是:

  

ln:“/ Users / username / Local / Recent”:没有这样的文件或目录

但是,如果我单独运行每行的复制粘贴,则会按预期创建链接。

2 个答案:

答案 0 :(得分:1)

保持简单的一种方法:

mdfind -0 "query" | ( cd "/Users/username/Local/Recent" ; xargs -0 -I path ln -s path . )

这当然不会处理重复的文件名等。

编辑:

您的解决方案失败的原因是,首先,$itemList的内容作为一个长命令执行(即忽略awk的换行输出),然后,第二,发生命令替换在报价删除之前。实际处理的内容大致相当于:

ln '-s' '"/pathtofile1/"' '"/to"' 'ln' '-s' '"/pathtofile2/"' '"/to"' 'ln' '-s' '"/pathtofile3/"' '"/to"'

/bin/ln将此视为:

ln [-Ffhinsv] source_file ... target_dir

命令的形式并检查最终参数是否为现有目录。该测试失败,因为目录名称包含周围的引号。请仔细注意您报告和比较的错误消息:

$ ln a b c "/Users/username/Local/Recent"
ln: /Users/username/Local/Recent: No such file or directory
$ ln a b c '"/Users/username/Local/Recent"'
ln: "/Users/username/Local/Recent": No such file or directory

故事的道德是,当你在shell中处理文件名时,最安全的解决方案是避免shell处理文件名,这样你就不必处理引用和其他副作用(是xargs解决方案的一大优势,并保持简单:避免构造复杂的多行shell命令。获得意想不到的结果太容易了。

答案 1 :(得分:0)

如果您使用一些实际的或至少是合理的路径作为示例,那么确定问题会更容易,但如果您想要的话,那么就不会为您创建这些目录。