【问题标题】:mdfind used for creating symlinks not working as expected用于创建符号链接的 mdfind 未按预期工作
【发布时间】:2009-12-18 20:14:35
【问题描述】:

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

/pathtofile1/
/pathtofile2/
/pathtofile3/

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

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

ln -s "/pathtofile1/" "/我想要这个的目录"
ln -s "/pathtofile2/" "/我想要这个的目录"
ln -s "/pathtofile3/" "/我想要这个的目录"

问题是,当我运行它时,我得到这个错误:“/directory where I want this: File does not exist”

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

有什么想法吗?

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


编辑了更多信息。

#! /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": 没有这样的文件或目录

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

【问题讨论】:

  • 将其更改为仅使用 'awk' 并且错误仍在发生...
  • 这些解决方案有帮助吗? (将一个答案标记为已接受或更好地解释您正在寻找的内容被认为是一种很好的 SO 礼仪。)
  • 您的一个问题是脚本的最后一行,其中包含$items 的反引号。 hat 将列表扁平化为一行,执行它,并捕获标准输出(没有),然后执行那个空字符串!建议:在第二个引号后的awk 中输出一个分号,括住目标目录名称。这将为您留下有效的外壳。然后,在执行“脚本”时,不要将其括在反引号中。您可能需要eval,或者您可以简单地将awk 脚本的输出通过管道传输到sh(或bash),还可以选择使用-x 进行跟踪。

标签: macos symlink spotlight ln


【解决方案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 命令。太容易得到意想不到的结果。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我不希望创建目录 - 事实上目录存在是因为,正如我上面所说,这些行单独运行得很好。例如,如果我添加 | head -1,命令将运行。
    • 所以发布您的实际来源和一些实际输入的实际示例
    • 为什么不逐个循环遍历结果而不是将它们全部打包成一个大字符串?
    • 我一直在玩弄这种可能性,在逐行调用它时遇到问题。知道为什么这不起作用吗?这是一种不常见的策略吗?
    • 我会说在多行字符串周围加上反引号并期望它做任何有用的事情是非常罕见的,但其他人可能有不同的看法。
    猜你喜欢
    • 2013-05-11
    • 1970-01-01
    • 2019-06-20
    • 2014-06-10
    • 1970-01-01
    • 2020-04-13
    • 1970-01-01
    • 2016-10-22
    • 1970-01-01
    相关资源
    最近更新 更多