【问题标题】:(mogrify) ln -s creating copies of files(mogrify) ln -s 创建文件的副本
【发布时间】:2014-01-13 13:20:50
【问题描述】:

运行以下脚本:

for i in $(find dir -name "*.jpg"); do
  ln -s $i
done

难以置信地为 90% 的文件创建符号链接,并复制剩余的 10%。这怎么可能?

编辑:之后发生的事情是相关的:

这些是我通过 mogrify 旋转的图像的链接,例如

mogrify -rotate 90 link_to_image

似乎 mogrify 在链接上默默地复制了图像,值得商榷的选择,但事实就是如此。

【问题讨论】:

  • 文件名是否有空格/其他空格?
  • 他们没有:Sun2ndCapture-10-S4908-2-00008.jpg -> ../Input/Sun2ndCapture-10-S4908-2/Sun2ndCapture-10-S4908-2-00008.jpg
  • @memecs: 这实际上是一个符号链接
  • @Igor,是的,其中有 90%。
  • 另外 10% 怎么样?

标签: bash batch-file find ln mogrify


【解决方案1】:

如果您想了解有关处理名称中包含空格的文件的更多信息,请跳过第一段

不清楚问题的根源是什么,我们的假设是问题出在文件名中的空格中:包含这些空格的文件未正确处理。

真正的问题是 mogrify 应用于创建的链接,处理它们并使用真实文件进行更改。

没有关于文件名中的空格。

处理名称中包含空格的文件

这是因为文件名中有空格。 你可以这样写:

find dir -name \*.jpg | while IFS= read i
do
  ln -s "$i"
done

(这里使用IFS= 来避免去除前导空格,感谢@Alfe 的提示)。

或使用xargs

如果名称可能包含“\n”,最好使用print0

find dir -name \*.jpg -print0 | xargs -0 -N1 ln -s

当然,你也可以使用其他方法,例如:

find dir -name '*.jpg' -exec ln -s "{}" \;
ln -s "$(find dir -name '*.jpg')" .

【讨论】:

  • 这如何解释有复制品?唯一的写入命令是 ln -s … 并且应该永远创建任何内容的副本。
  • 此外,您应该使用while IFS= read i 以避免去除前导空格,当然您需要在ln -s "$i" 处使用双引号。
  • 发现问题,看我的回答
  • @memecs:完美!恭喜!!感谢您提出一个有趣的问题!
【解决方案2】:

(Imagemagick) mogrify 应用于链接删除链接并复制图像

【讨论】:

    【解决方案3】:

    尝试使用单引号:

    find dir -name '*.jpg' -exec ln -s "{}" \;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-27
      • 2013-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-17
      • 2018-03-08
      相关资源
      最近更新 更多